diff --git a/DEPS b/DEPS
index c5c0f9c0..205a48c 100644
--- a/DEPS
+++ b/DEPS
@@ -299,15 +299,15 @@
   # 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': '0541e51e98faf57175bfe8e0e5e9acaf133363f4',
+  'skia_revision': '11f351576a5e4471a227be2e772bab2ce5e989b6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '755511a138609ac5939449a8ac615c15603a4454',
+  'v8_revision': '9fda725f2bd38fa21bf2a6d14b145f2d0712da94',
   # 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': '2ec90ada057b57c872ae2d122865f2304b111b1d',
+  'angle_revision': '47c0659eed56386d0f186b43935febeb188e347b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -386,7 +386,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'fd1b3057397dbca3edb26ff073fad6f7e15b4cbd',
+  'devtools_frontend_revision': 'a5aba44fc2de013e13e3b4f9fd546b6b41fc353a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -426,7 +426,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': 'd436ee4dbd715fce16e03a8117fe0280e2f139d5',
+  'dawn_revision': '66d487395d293c983bde13e14709df6eb2bb01e4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -470,7 +470,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.
-  'libcxxabi_revision':    '87d8fe050bedb143f232b9ff99a0a46897640e5d',
+  'libcxxabi_revision':    'ff8e691cbc2ab7905dd6a0c218bcc401b7830e54',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -764,7 +764,7 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '0f25b79ef215f4690b9924ad4687279e07b68fa9',
+    'b329470859c82202292ab46084208133d3e93175',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1090,7 +1090,7 @@
     Var('chromium_git') + '/angle/angle.git' + '@' +  Var('angle_revision'),
 
   'src/third_party/content_analysis_sdk/src':
-    Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + '3d3f3d6f27288d7b0628ae5259238162c5e5ae76',
+    Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + '5e3ee30867df7020b52db51f4396873bace0e58c',
 
   'src/third_party/dav1d/libdav1d':
     Var('chromium_git') + '/external/github.com/videolan/dav1d.git' + '@' + 'ed63a7459376a21e88b871006574dc2055a2ea35',
@@ -1206,13 +1206,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '27ac29f980eb459c7da5ddea20ec515d7c8627c9',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'eee53367c1fab7b7ca150ee45aacafb4103c4ed2',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '72a697fa3b59670e4df06b4491bac9811a6d813f',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '662b0054b1948acace069f2ea35876de6aebe5f4',
     'condition': 'checkout_src_internal',
   },
 
@@ -1372,7 +1372,7 @@
     Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '41cdffd71c9948f63c7ad36e1fb0ff519aa7a37e',
 
   'src/third_party/icu':
-    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'c6b68522318204f795a8f04caebf6c0beb679cc4',
+    Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '1e49ac26ddc712b1ab702f69023cbc57e9ae6628',
 
   'src/third_party/icu4j': {
       'packages': [
@@ -1389,7 +1389,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/jacoco',
-              'version': 'O8mNUqIbFxvOcBsSNfbvpdUFvY4nfrPY0QA2kHoO2pQC',
+              'version': 'l98qLtenArHWtjxXVN4ZtZ0M_Jnr6s2-7KW3bXDTBrYC',
           },
       ],
       'condition': 'checkout_android',
@@ -1684,7 +1684,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a2db94d29425fa1d5332528e58e19d1f67dab10b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '6a84e7b38165dd5d14af8dc4faa47cad2caf8709',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1816,7 +1816,7 @@
     Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + 'c036420683f672d685e27415de0a5f5e85bdc23f',
 
   'src/third_party/tflite/src':
-    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + '60ec371de65a63d588bcfce7a99482847ad1312e',
+    Var('chromium_git') + '/external/github.com/tensorflow/tensorflow.git' + '@' + 'f63612ab30f4c880f3379813e5b6b4a3d804f928',
 
   'src/third_party/turbine': {
       'packages': [
@@ -1869,7 +1869,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6c8361e98f1daba65902f5e2fc1297893ac14b67',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'cec856991bc95b79baa66b5e6513f2ed10794dfd',
+    Var('webrtc_git') + '/src.git' + '@' + '7d81b9b14431d15486e7c14ad3750eb6e831c4ad',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1939,7 +1939,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ab2d755c334e9c3ef26e3041e70013b3feb8cada',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ccb3f8c25d8f5d607c34165291a22bcf3b87460d',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc
index 38edb215..0fc17c1 100644
--- a/android_webview/browser/aw_autofill_client.cc
+++ b/android_webview/browser/aw_autofill_client.cc
@@ -14,8 +14,11 @@
 #include "base/android/build_info.h"
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
+#include "base/android/locale_utils.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/check_op.h"
 #include "base/notreached.h"
+#include "components/android_autofill/browser/android_autofill_manager.h"
 #include "components/android_autofill/browser/autofill_provider_android.h"
 #include "components/autofill/core/browser/autofill_download_manager.h"
 #include "components/autofill/core/browser/payments/legal_message_line.h"
@@ -41,6 +44,20 @@
 
 namespace android_webview {
 
+void AwAutofillClient::CreateForWebContents(content::WebContents* contents,
+                                            bool use_android_autofill_manager) {
+  DCHECK(contents);
+  if (!FromWebContents(contents)) {
+    contents->SetUserData(UserDataKey(),
+                          base::WrapUnique(new AwAutofillClient(
+                              contents, use_android_autofill_manager)));
+  }
+#if DCHECK_IS_ON()
+  DCHECK_EQ(use_android_autofill_manager,
+            FromWebContents(contents)->use_android_autofill_manager_);
+#endif
+}
+
 AwAutofillClient::~AwAutofillClient() {
   HideAutofillPopup(autofill::PopupHidingReason::kTabGone);
 }
@@ -389,8 +406,20 @@
 // AwContents. The native object creates the java peer which handles most
 // autofill functionality at the java side. The java peer is owned by Java
 // AwContents. The native object only maintains a weak ref to it.
-AwAutofillClient::AwAutofillClient(WebContents* contents)
-    : content::WebContentsUserData<AwAutofillClient>(*contents) {
+AwAutofillClient::AwAutofillClient(WebContents* contents,
+                                   bool use_android_autofill_manager)
+    : autofill::ContentAutofillClient(
+          contents,
+          use_android_autofill_manager
+              ? base::BindRepeating(&autofill::AndroidDriverInitHook, this)
+              : base::BindRepeating(&autofill::BrowserDriverInitHook,
+                                    this,
+                                    base::android::GetDefaultLocaleString()))
+#if DCHECK_IS_ON()
+      ,
+      use_android_autofill_manager_(use_android_autofill_manager)
+#endif
+{
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> delegate;
   delegate.Reset(
@@ -449,9 +478,7 @@
   // spots and the content public API doesn't have const accessors. So the const
   // cast is the lesser of two evils.
   return const_cast<content::WebContents&>(
-      content::WebContentsUserData<AwAutofillClient>::GetWebContents());
+      ContentAutofillClient::GetWebContents());
 }
 
-WEB_CONTENTS_USER_DATA_KEY_IMPL(AwAutofillClient);
-
 }  // namespace android_webview
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h
index 3158655..10ceeb2 100644
--- a/android_webview/browser/aw_autofill_client.h
+++ b/android_webview/browser/aw_autofill_client.h
@@ -11,8 +11,9 @@
 
 #include "base/android/jni_weak_ref.h"
 #include "base/compiler_specific.h"
+#include "base/dcheck_is_on.h"
 #include "base/memory/raw_ptr.h"
-#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
 #include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "ui/android/view_android.h"
@@ -45,16 +46,31 @@
 
 namespace android_webview {
 
-// Manager delegate for the autofill functionality. Android webview
-// supports enabling autocomplete feature for each webview instance
-// (different than the browser which supports enabling/disabling for
-// a profile). Since there is only one pref service for a given browser
-// context, we cannot enable this feature via UserPrefs. Rather, we always
-// keep the feature enabled at the pref service, and control it via
-// the delegates.
-class AwAutofillClient : public autofill::AutofillClient,
-                         public content::WebContentsUserData<AwAutofillClient> {
+// Manager delegate for the autofill functionality.
+//
+// Android O and beyond shall use `AndroidAutofillManager` (and
+// `AutofillProvider`), whereas earlier versions use a `BrowserAutofillManager`.
+// This is determined by the `use_android_autofill_manager` parameters below.
+//
+// Android webview supports enabling autocomplete feature for each webview
+// instance (different than the browser which supports enabling/disabling for a
+// profile). Since there is only one pref service for a given browser context,
+// we cannot enable this feature via UserPrefs. Rather, we always keep the
+// feature enabled at the pref service, and control it via the delegates.
+class AwAutofillClient : public autofill::ContentAutofillClient {
  public:
+  static AwAutofillClient* FromWebContents(content::WebContents* web_contents) {
+    return static_cast<AwAutofillClient*>(
+        autofill::ContentAutofillClient::FromWebContents(web_contents));
+  }
+
+  // The `use_android_autofill_manager` parameter determines which
+  // DriverInitCallback to use:
+  // - autofill::BrowserDriverInitHook() (to be used before Android O) or
+  // - android_webview::AndroidDriverInitHook() (to be used as of Android O).
+  static void CreateForWebContents(content::WebContents* contents,
+                                   bool use_android_autofill_manager);
+
   AwAutofillClient(const AwAutofillClient&) = delete;
   AwAutofillClient& operator=(const AwAutofillClient&) = delete;
 
@@ -162,7 +178,11 @@
                           jint position);
 
  private:
-  explicit AwAutofillClient(content::WebContents* web_contents);
+  // `use_android_autofill_manager` determines which DriverInitCallback to use
+  // for the ContentAutofillDriverFactory: autofill::BrowserDriverInitHook() or
+  // android_webview::AndroidDriverInitHook().
+  AwAutofillClient(content::WebContents* web_contents,
+                   bool use_android_autofill_manager);
   friend class content::WebContentsUserData<AwAutofillClient>;
 
   void ShowAutofillPopupImpl(
@@ -182,7 +202,9 @@
   base::WeakPtr<autofill::AutofillPopupDelegate> delegate_;
   std::unique_ptr<autofill::AutofillDownloadManager> download_manager_;
 
-  WEB_CONTENTS_USER_DATA_KEY_DECL();
+#if DCHECK_IS_ON()
+  bool use_android_autofill_manager_;
+#endif
 };
 
 }  // namespace android_webview
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc
index a938e6c..623e43b 100644
--- a/android_webview/browser/aw_contents.cc
+++ b/android_webview/browser/aw_contents.cc
@@ -62,7 +62,10 @@
 #include "base/threading/thread_restrictions.h"
 #include "components/android_autofill/browser/android_autofill_manager.h"
 #include "components/android_autofill/browser/autofill_provider_android.h"
+#include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/navigation_interception/intercept_navigation_delegate.h"
@@ -327,20 +330,10 @@
   if (!autofill_provider && !autocomplete_enabled)
     return;
 
-  AwAutofillClient::CreateForWebContents(web_contents);
-
   // WebView browser tests use BrowserAutofillManager if `!autofill_provider`.
-  ContentAutofillDriverFactory::DriverInitCallback driver_init_hook =
-      autofill_provider
-          ? base::BindRepeating(&autofill::AndroidDriverInitHook,
-                                AwAutofillClient::FromWebContents(web_contents))
-          : base::BindRepeating(&autofill::BrowserDriverInitHook,
-                                AwAutofillClient::FromWebContents(web_contents),
-                                base::android::GetDefaultLocaleString());
-
-  ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      web_contents, AwAutofillClient::FromWebContents(web_contents),
-      std::move(driver_init_hook));
+  AwAutofillClient::CreateForWebContents(
+      web_contents,
+      /*use_android_autofill_manager=*/!!autofill_provider);
 }
 
 void AwContents::SetAwAutofillClient(const JavaRef<jobject>& client) {
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc
index 3cca1c11..c9129d9 100644
--- a/ash/accelerators/accelerator_commands.cc
+++ b/ash/accelerators/accelerator_commands.cc
@@ -95,6 +95,7 @@
 #include "ui/gfx/geometry/point.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/frame_caption_button.h"
+#include "ui/wm/core/window_animations.h"
 #include "ui/wm/core/window_util.h"
 
 // Keep the functions in this file in alphabetical order.
@@ -507,8 +508,7 @@
   if (!chromeos::wm::features::IsWindowLayoutMenuEnabled()) {
     return false;
   }
-  aura::Window* window = window_util::GetActiveWindow();
-  return window && chromeos::wm::CanFloatWindow(window);
+  return window_util::GetActiveWindow() != nullptr;
 }
 
 bool CanToggleGameDashboard() {
@@ -1259,7 +1259,13 @@
   DCHECK(chromeos::wm::features::IsWindowLayoutMenuEnabled());
   aura::Window* window = window_util::GetActiveWindow();
   DCHECK(window);
-  DCHECK(chromeos::wm::CanFloatWindow(window));
+  // `CanFloatWindow` check is placed here rather than
+  // `CanToggleFloatingWindow` as otherwise the bounce would not behave
+  // properly.
+  if (!chromeos::wm::CanFloatWindow(window)) {
+    wm::AnimateWindow(window, wm::WINDOW_ANIMATION_TYPE_BOUNCE);
+    return;
+  }
   Shell::Get()->float_controller()->ToggleFloat(window);
   base::RecordAction(base::UserMetricsAction("Accel_Toggle_Floating"));
 }
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.cc b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
index a88b852..5bff9234 100644
--- a/ash/ambient/backdrop/ambient_backend_controller_impl.cc
+++ b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
@@ -24,6 +24,7 @@
 #include "base/barrier_closure.h"
 #include "base/base64.h"
 #include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
 #include "base/guid.h"
 #include "base/logging.h"
 #include "base/time/time.h"
@@ -42,6 +43,7 @@
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "ui/gfx/geometry/size.h"
 #include "url/gurl.h"
 
 namespace ash {
@@ -232,44 +234,40 @@
     const backdrop::ScreenUpdate& backdrop_screen_update) {
   ScreenUpdate screen_update;
   // Parse |AmbientModeTopic|.
-  int topics_size = backdrop_screen_update.next_topics_size();
-  if (topics_size > 0) {
-    for (auto& backdrop_topic : backdrop_screen_update.next_topics()) {
-      DCHECK(backdrop_topic.has_url());
+  for (const auto& backdrop_topic : backdrop_screen_update.next_topics()) {
+    DCHECK(backdrop_topic.has_url());
 
-      auto topic_type = ToAmbientModeTopicType(backdrop_topic);
-      if (!ambient::util::IsAmbientModeTopicTypeAllowed(topic_type)) {
-        DVLOG(3) << "Filtering topic_type: "
-                 << backdrop::TopicSource_Name(backdrop_topic.topic_type());
-        continue;
-      }
-
-      AmbientModeTopic ambient_topic;
-      ambient_topic.topic_type = topic_type;
-
-      // If the |portrait_image_url| field is not empty, we assume the image is
-      // portrait.
-      if (backdrop_topic.has_portrait_image_url()) {
-        ambient_topic.url = backdrop_topic.portrait_image_url();
-        ambient_topic.is_portrait = true;
-      } else {
-        ambient_topic.url = backdrop_topic.url();
-      }
-
-      if (backdrop_topic.has_related_topic()) {
-        if (backdrop_topic.related_topic().has_portrait_image_url()) {
-          ambient_topic.related_image_url =
-              backdrop_topic.related_topic().portrait_image_url();
-        } else {
-          ambient_topic.related_image_url =
-              backdrop_topic.related_topic().url();
-        }
-      }
-      ambient_topic.details = BuildBackdropTopicDetails(backdrop_topic);
-      ambient_topic.related_details =
-          BuildBackdropTopicDetails(backdrop_topic.related_topic());
-      screen_update.next_topics.emplace_back(ambient_topic);
+    auto topic_type = ToAmbientModeTopicType(backdrop_topic);
+    if (!ambient::util::IsAmbientModeTopicTypeAllowed(topic_type)) {
+      DVLOG(3) << "Filtering topic_type: "
+               << backdrop::TopicSource_Name(backdrop_topic.topic_type());
+      continue;
     }
+
+    AmbientModeTopic ambient_topic;
+    ambient_topic.topic_type = topic_type;
+
+    // If the |portrait_image_url| field is not empty, we assume the image is
+    // portrait.
+    if (backdrop_topic.has_portrait_image_url()) {
+      ambient_topic.url = backdrop_topic.portrait_image_url();
+      ambient_topic.is_portrait = true;
+    } else {
+      ambient_topic.url = backdrop_topic.url();
+    }
+
+    if (backdrop_topic.has_related_topic()) {
+      if (backdrop_topic.related_topic().has_portrait_image_url()) {
+        ambient_topic.related_image_url =
+            backdrop_topic.related_topic().portrait_image_url();
+      } else {
+        ambient_topic.related_image_url = backdrop_topic.related_topic().url();
+      }
+    }
+    ambient_topic.details = BuildBackdropTopicDetails(backdrop_topic);
+    ambient_topic.related_details =
+        BuildBackdropTopicDetails(backdrop_topic.related_topic());
+    screen_update.next_topics.emplace_back(ambient_topic);
   }
 
   // Parse |WeatherInfo|.
@@ -293,6 +291,19 @@
   return screen_update;
 }
 
+// Helper function to extract image URLs from screen update response for
+// screen saver preview.
+std::vector<GURL> ToPreviewUrls(const ScreenUpdate& screen_update) {
+  std::vector<GURL> preview_urls;
+  for (const auto& topic : screen_update.next_topics) {
+    preview_urls.emplace_back(topic.url);
+    if (preview_urls.size() == /*max_num_previews=*/3) {
+      break;
+    }
+  }
+  return preview_urls;
+}
+
 bool IsArtSettingVisible(const ArtSetting& art_setting) {
   const auto& album_id = art_setting.album_id;
 
@@ -381,6 +392,18 @@
       screen_size, std::move(callback)));
 }
 
+void AmbientBackendControllerImpl::FetchPreviewImages(
+    OnPreviewImagesFetchedCallback callback) {
+  constexpr int num_topics = 3;
+  const gfx::Size preview_size = gfx::Size(360, 130);
+  OnScreenUpdateInfoFetchedCallback combined_callback =
+      base::BindOnce(&ToPreviewUrls).Then(std::move(callback));
+  Shell::Get()->ambient_controller()->RequestAccessToken(base::BindOnce(
+      &AmbientBackendControllerImpl::FetchScreenUpdateInfoInternal,
+      weak_factory_.GetWeakPtr(), num_topics, false, preview_size,
+      std::move(combined_callback)));
+}
+
 void AmbientBackendControllerImpl::GetSettings(GetSettingsCallback callback) {
   Shell::Get()->ambient_controller()->RequestAccessToken(
       base::BindOnce(&AmbientBackendControllerImpl::StartToGetSettings,
@@ -475,7 +498,6 @@
     const std::string& access_token) {
   if (gaia_id.empty() || access_token.empty()) {
     LOG(ERROR) << "Failed to fetch access token for ScreenUpdate";
-    // Returns an empty instance to indicate the failure.
     std::move(callback).Run(ash::ScreenUpdate());
     return;
   }
@@ -685,7 +707,7 @@
     int preview_width,
     int preview_height,
     int num_previews,
-    GetGooglePhotosAlbumsPreviewCallback callback,
+    OnPreviewImagesFetchedCallback callback,
     const std::string& gaia_id,
     const std::string& access_token) {
   BackdropClientConfig::Request request =
@@ -710,7 +732,7 @@
     int preview_width,
     int preview_height,
     int num_previews,
-    GetGooglePhotosAlbumsPreviewCallback callback) {
+    OnPreviewImagesFetchedCallback callback) {
   Shell::Get()->ambient_controller()->RequestAccessToken(base::BindOnce(
       &AmbientBackendControllerImpl::StartToGetGooglePhotosAlbumsPreview,
       weak_factory_.GetWeakPtr(), album_ids, preview_width, preview_height,
@@ -737,7 +759,7 @@
 }
 
 void AmbientBackendControllerImpl::OnGetGooglePhotosAlbumsPreview(
-    GetGooglePhotosAlbumsPreviewCallback callback,
+    OnPreviewImagesFetchedCallback callback,
     std::unique_ptr<BackdropURLLoader> backdrop_url_loader,
     std::unique_ptr<std::string> response) {
   DCHECK(backdrop_url_loader);
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.h b/ash/ambient/backdrop/ambient_backend_controller_impl.h
index a2beb3a..252e173e 100644
--- a/ash/ambient/backdrop/ambient_backend_controller_impl.h
+++ b/ash/ambient/backdrop/ambient_backend_controller_impl.h
@@ -33,6 +33,7 @@
       bool show_pair_personal_portraits,
       const gfx::Size& screen_size,
       OnScreenUpdateInfoFetchedCallback callback) override;
+  void FetchPreviewImages(OnPreviewImagesFetchedCallback callback) override;
   void GetSettings(GetSettingsCallback callback) override;
   void UpdateSettings(const AmbientSettings& settings,
                       UpdateSettingsCallback callback) override;
@@ -54,7 +55,7 @@
       int preview_width,
       int preview_height,
       int num_previews,
-      GetGooglePhotosAlbumsPreviewCallback callback) override;
+      OnPreviewImagesFetchedCallback callback) override;
 
  private:
   using BackdropClientConfig = chromeos::ambient::BackdropClientConfig;
@@ -116,12 +117,12 @@
       int preview_width,
       int preview_height,
       int num_previews,
-      GetGooglePhotosAlbumsPreviewCallback callback,
+      OnPreviewImagesFetchedCallback callback,
       const std::string& gaia_id,
       const std::string& access_token);
 
   void OnGetGooglePhotosAlbumsPreview(
-      GetGooglePhotosAlbumsPreviewCallback callback,
+      OnPreviewImagesFetchedCallback callback,
       std::unique_ptr<BackdropURLLoader> backdrop_url_loader,
       std::unique_ptr<std::string> response);
 
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index a6ef192..0462c71 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -5238,6 +5238,9 @@
       <message name="IDS_ASH_SCREEN_CAPTURE_RECORDING_TITLE" desc="The titile of the notification which shows after a screen recording is taken.">
         Screen recording taken
       </message>
+      <message name="IDS_ASH_SCREEN_CAPTURE_GIF_RECORDING_TITLE" desc="The titile of the notification which shows after a screen recording is taken.">
+        GIF recording taken
+      </message>
       <message name="IDS_ASH_SCREEN_CAPTURE_MESSAGE" desc="The message shows in the screenshot or screen recording notification.">
         Show in folder
       </message>
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc
index d8fd2a3b..bc902971 100644
--- a/ash/capture_mode/capture_label_view.cc
+++ b/ash/capture_mode/capture_label_view.cc
@@ -148,7 +148,12 @@
     CaptureModeSession* capture_mode_session,
     views::Button::PressedCallback on_capture_button_pressed,
     views::Button::PressedCallback on_drop_down_button_pressed)
-    : capture_mode_session_(capture_mode_session) {
+    : capture_mode_session_(capture_mode_session),
+      // Since this view has fully circular rounded corners, we can't use a nine
+      // patch layer for the shadow. We have to use the `ShadowOnTextureLayer`.
+      // For more info, see https://crbug.com/1308800.
+      shadow_(SystemShadow::CreateShadowOnTextureLayer(
+          SystemShadow::Type::kElevation12)) {
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
 
@@ -176,6 +181,8 @@
         kCaptureLabelRadius, views::HighlightBorder::Type::kHighlightBorder2,
         /*use_light_colors=*/false));
   }
+
+  shadow_->SetRoundedCornerRadius(kCaptureLabelRadius);
 }
 
 CaptureLabelView::~CaptureLabelView() = default;
@@ -296,6 +303,14 @@
   return !!countdown_finished_callback_;
 }
 
+void CaptureLabelView::AddedToWidget() {
+  // Since the layer of the shadow has to be added as a sibling to this view's
+  // layer, we need to wait until the view is added to the widget.
+  auto* parent = layer()->parent();
+  parent->Add(shadow_->GetLayer());
+  parent->StackAtBottom(shadow_->GetLayer());
+}
+
 void CaptureLabelView::Layout() {
   gfx::Rect label_bounds = GetLocalBounds();
   capture_button_container_->SetBoundsRect(label_bounds);
@@ -304,8 +319,12 @@
   label_->SetBoundsRect(label_bounds);
 
   // This is necessary to update the focus ring, which is a child view of
-  // |this|.
+  // `this`.
   views::View::Layout();
+
+  // The shadow layer is a sibling of this view's layer, and should have the
+  // same bounds.
+  shadow_->SetContentBounds(layer()->bounds());
 }
 
 gfx::Size CaptureLabelView::CalculatePreferredSize() const {
diff --git a/ash/capture_mode/capture_label_view.h b/ash/capture_mode/capture_label_view.h
index db23340..69b0919 100644
--- a/ash/capture_mode/capture_label_view.h
+++ b/ash/capture_mode/capture_label_view.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "ash/ash_export.h"
+#include "ash/style/system_shadow.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/weak_ptr.h"
 #include "ui/gfx/animation/animation_delegate.h"
@@ -71,6 +72,7 @@
   bool IsInCountDownAnimation() const;
 
   // views::View:
+  void AddedToWidget() override;
   void Layout() override;
   gfx::Size CalculatePreferredSize() const override;
   void OnThemeChanged() override;
@@ -118,6 +120,8 @@
   std::unique_ptr<DropToStopRecordingButtonAnimation>
       drop_to_stop_button_animation_;
 
+  std::unique_ptr<SystemShadow> shadow_;
+
   base::WeakPtrFactory<CaptureLabelView> weak_factory_{this};
 };
 
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 77960be..c192eb0 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -74,6 +74,7 @@
 // consecutive.
 constexpr base::TimeDelta kConsecutiveScreenshotThreshold = base::Seconds(5);
 
+constexpr char kScreenCaptureNotificationId[] = "capture_mode_notification";
 constexpr char kScreenCaptureStoppedNotificationId[] =
     "capture_mode_stopped_notification";
 constexpr char kScreenCaptureNotifierId[] = "ash.capture_mode_controller";
@@ -308,7 +309,7 @@
 void ShowDisabledNotification(CaptureAllowance allowance) {
   DCHECK(allowance != CaptureAllowance::kAllowed);
   ShowNotification(
-      capture_mode_util::kScreenCaptureNotificationId,
+      kScreenCaptureNotificationId,
       GetDisabledNotificationMessageId(allowance, /*for_title=*/true),
       GetDisabledNotificationMessageId(allowance, /*for_title=*/false),
       /*optional_fields=*/{}, /*delegate=*/nullptr,
@@ -395,6 +396,19 @@
   return temp_dir;
 }
 
+int GetNotificationTitleIdForFile(const base::FilePath& file_path) {
+  if (file_path.MatchesExtension(".gif")) {
+    return IDS_ASH_SCREEN_CAPTURE_GIF_RECORDING_TITLE;
+  }
+
+  if (file_path.MatchesExtension(".webm")) {
+    return IDS_ASH_SCREEN_CAPTURE_RECORDING_TITLE;
+  }
+
+  DCHECK(file_path.MatchesExtension(".png"));
+  return IDS_ASH_SCREEN_CAPTURE_SCREENSHOT_TITLE;
+}
+
 }  // namespace
 
 CaptureModeController::CaptureModeController(
@@ -850,9 +864,8 @@
 
   // Remove the previous notification when switching to another user.
   auto* message_center = message_center::MessageCenter::Get();
-  message_center->RemoveNotificationsForNotifierId(message_center::NotifierId(
-      message_center::NotifierType::SYSTEM_COMPONENT, kScreenCaptureNotifierId,
-      NotificationCatalogName::kScreenCapture));
+  message_center->RemoveNotification(kScreenCaptureNotificationId,
+                                     /*by_user=*/false);
 }
 
 void CaptureModeController::OnSessionStateChanged(
@@ -1301,7 +1314,7 @@
       // NOTE: Holding space `client` may be `nullptr` in tests.
       if (auto* client = HoldingSpaceController::Get()->client()) {
         client->AddScreenCapture(
-            recording_type_ == RecordingType::kGif
+            saved_video_file_path.MatchesExtension(".gif")
                 ? HoldingSpaceItem::Type::kScreenRecordingGif
                 : HoldingSpaceItem::Type::kScreenRecording,
             saved_video_file_path);
@@ -1324,8 +1337,7 @@
     const gfx::Image& preview_image,
     const CaptureModeType type) {
   const bool for_video = type == CaptureModeType::kVideo;
-  const int title_id = for_video ? IDS_ASH_SCREEN_CAPTURE_RECORDING_TITLE
-                                 : IDS_ASH_SCREEN_CAPTURE_SCREENSHOT_TITLE;
+  const int title_id = GetNotificationTitleIdForFile(screen_capture_path);
   const int message_id = for_video && low_disk_space_threshold_reached_
                              ? IDS_ASH_SCREEN_CAPTURE_LOW_STORAGE_SPACE_MESSAGE
                              : IDS_ASH_SCREEN_CAPTURE_MESSAGE;
@@ -1343,9 +1355,7 @@
   optional_fields.image_path = screen_capture_path;
 
   ShowNotification(
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(
-          screen_capture_path),
-      title_id, message_id, optional_fields,
+      kScreenCaptureNotificationId, title_id, message_id, optional_fields,
       base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
           base::BindRepeating(&CaptureModeController::HandleNotificationClicked,
                               weak_ptr_factory_.GetWeakPtr(),
@@ -1394,9 +1404,7 @@
   // to this function. The callback's state owns any passed-by-ref arguments,
   // such as |screen_capture_path| which we use in this function.
   message_center::MessageCenter::Get()->RemoveNotification(
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(
-          screen_capture_path),
-      /*by_user=*/false);
+      kScreenCaptureNotificationId, /*by_user=*/false);
 }
 
 base::FilePath CaptureModeController::BuildImagePath() const {
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc
index 2c5af43..062dbe8 100644
--- a/ash/capture_mode/capture_mode_unittests.cc
+++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -129,6 +129,7 @@
 
 constexpr char kEndRecordingReasonInClamshellHistogramName[] =
     "Ash.CaptureModeController.EndRecordingReason.ClamshellMode";
+constexpr char kScreenCaptureNotificationId[] = "capture_mode_notification";
 
 // Returns true if the software-composited cursor is enabled.
 bool IsCursorCompositingEnabled() {
@@ -138,22 +139,11 @@
       ->is_cursor_compositing_enabled();
 }
 
-bool HasNotificationWithId(const std::string& id) {
-  const message_center::NotificationList::Notifications notifications =
-      message_center::MessageCenter::Get()->GetVisibleNotifications();
-  for (const auto* notification : notifications) {
-    if (notification->id() == id)
-      return true;
-  }
-  return false;
-}
-
 const message_center::Notification* GetPreviewNotification() {
   const message_center::NotificationList::Notifications notifications =
       message_center::MessageCenter::Get()->GetVisibleNotifications();
   for (const auto* notification : notifications) {
-    if (base::StartsWith(notification->id(),
-                         capture_mode_util::kScreenCaptureNotificationId)) {
+    if (notification->id() == kScreenCaptureNotificationId) {
       return notification;
     }
   }
@@ -470,8 +460,7 @@
 
   // message_center::MessageCenterObserver:
   void OnNotificationAdded(const std::string& notification_id) override {
-    if (base::StartsWith(notification_id,
-                         capture_mode_util::kScreenCaptureNotificationId)) {
+    if (notification_id == kScreenCaptureNotificationId) {
       run_loop_.Quit();
     }
   }
@@ -1952,37 +1941,6 @@
       gfx::test::AreBitmapsEqual(notification_thumbnail, service_thumbnail));
 }
 
-// Verifies that taking multiple screenshots generates multiple notifications.
-TEST_F(CaptureModeTest, MultipleNotificationsForMultipleScreenshots) {
-  // Take a screenshot.
-  auto* controller = StartCaptureSession(CaptureModeSource::kFullscreen,
-                                         CaptureModeType::kImage);
-  controller->PerformCapture();
-  auto path1 = WaitForCaptureFileToBeSaved();
-  EXPECT_TRUE(HasNotificationWithId(
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(path1)));
-  auto notifications =
-      message_center::MessageCenter::Get()->GetVisibleNotifications();
-  EXPECT_EQ(notifications.size(), 1ul);
-
-  // Wait for one second. This ensures that the second screenshot has a
-  // different ID than the first screenshot.
-  WaitForSeconds(1);
-
-  // Take a second screenshot.
-  controller = StartCaptureSession(CaptureModeSource::kFullscreen,
-                                   CaptureModeType::kImage);
-  controller->PerformCapture();
-  auto path2 = WaitForCaptureFileToBeSaved();
-  notifications =
-      message_center::MessageCenter::Get()->GetVisibleNotifications();
-  EXPECT_EQ(notifications.size(), 2ul);
-  EXPECT_TRUE(HasNotificationWithId(
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(path1)));
-  EXPECT_TRUE(HasNotificationWithId(
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(path2)));
-}
-
 TEST_F(CaptureModeTest, LowDriveFsSpace) {
   auto* controller = StartCaptureSession(CaptureModeSource::kFullscreen,
                                          CaptureModeType::kVideo);
diff --git a/ash/capture_mode/capture_mode_util.cc b/ash/capture_mode/capture_mode_util.cc
index 519dc25..6c582047 100644
--- a/ash/capture_mode/capture_mode_util.cc
+++ b/ash/capture_mode/capture_mode_util.cc
@@ -496,12 +496,6 @@
   return box_layout;
 }
 
-std::string GetScreenCaptureNotificationIdForPath(const base::FilePath& path) {
-  DCHECK(!path.empty());
-  return base::StringPrintf("%s-%s", kScreenCaptureNotificationId,
-                            path.BaseName().value().c_str());
-}
-
 void MaybeUpdateCameraPrivacyIndicator(bool camera_on) {
   if (features::IsPrivacyIndicatorsEnabled()) {
     UpdatePrivacyIndicators(
diff --git a/ash/capture_mode/capture_mode_util.h b/ash/capture_mode/capture_mode_util.h
index 0fe46cd4..1475c46b 100644
--- a/ash/capture_mode/capture_mode_util.h
+++ b/ash/capture_mode/capture_mode_util.h
@@ -186,10 +186,6 @@
 // Initializes the box layout for the `view` in the settings menu.
 views::BoxLayout* CreateAndInitBoxLayoutForView(views::View* view);
 
-// Gets the notification ID of a screen capture given its filepath.
-ASH_EXPORT std::string GetScreenCaptureNotificationIdForPath(
-    const base::FilePath& path);
-
 // If the privacy indicators feature is enabled, the below functions update the
 // camera and microphone capture mode indicators according to the given values.
 void MaybeUpdateCameraPrivacyIndicator(bool camera_on);
diff --git a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc
index 81e2ea6c0..57e610e 100644
--- a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc
+++ b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits.cc
@@ -96,6 +96,10 @@
       return arc::mojom::BitrateDataView::Tag::kConstant;
     case media::Bitrate::Mode::kVariable:
       return arc::mojom::BitrateDataView::Tag::kVariable;
+    case media::Bitrate::Mode::kExternal:
+      // Ash encoder doesn't need to support external rate control.
+      NOTREACHED();
+      return arc::mojom::BitrateDataView::Tag::kConstant;
   }
   NOTREACHED();
   return arc::mojom::BitrateDataView::Tag::kConstant;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index d8b77a2..316e8b8 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1397,7 +1397,7 @@
 // Switch the "More Apps" button in eche launcher to show small app icons
 BASE_FEATURE(kEcheLauncherIconsInMoreAppsButton,
              "EcheLauncherIconsInMoreAppsButton",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables multi-zone rgb keyboard customization.
 BASE_FEATURE(kMultiZoneRgbKeyboard,
@@ -1652,11 +1652,6 @@
              "ProjectorAppDebug",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Controls whether the Projector exclude transcript feature is enabled.
-BASE_FEATURE(kProjectorExcludeTranscript,
-             "ProjectorExcludeTranscript",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Controls whether to fold short gap between transcript into the previous
 // transcript.
 BASE_FEATURE(kProjectorFoldShortGapIntoPreviousTranscript,
@@ -2991,10 +2986,6 @@
   return base::FeatureList::IsEnabled(kProjectorAppDebug);
 }
 
-bool IsProjectorExcludeTranscriptEnabled() {
-  return base::FeatureList::IsEnabled(kProjectorExcludeTranscript);
-}
-
 bool IsProjectorTutorialVideoViewEnabled() {
   return base::FeatureList::IsEnabled(kProjectorTutorialVideoView);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 238a280..e3899944 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -467,7 +467,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kProjectorManagedUser);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kProjectorAppDebug);
 COMPONENT_EXPORT(ASH_CONSTANTS)
-BASE_DECLARE_FEATURE(kProjectorExcludeTranscript);
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kProjectorTutorialVideoView);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kProjectorCustomThumbnail);
@@ -805,7 +804,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorAllUserEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorManagedUserEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorAppDebugMode();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorExcludeTranscriptEnabled();
+
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorTutorialVideoViewEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorCustomThumbnailEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsProjectorLocalPlaybackEnabled();
diff --git a/ash/public/cpp/ambient/ambient_backend_controller.h b/ash/public/cpp/ambient/ambient_backend_controller.h
index a7859e9..88e958e 100644
--- a/ash/public/cpp/ambient/ambient_backend_controller.h
+++ b/ash/public/cpp/ambient/ambient_backend_controller.h
@@ -94,6 +94,8 @@
  public:
   using OnScreenUpdateInfoFetchedCallback =
       base::OnceCallback<void(const ScreenUpdate&)>;
+  using OnPreviewImagesFetchedCallback =
+      base::OnceCallback<void(const std::vector<GURL>& preview_urls)>;
   using GetSettingsCallback =
       base::OnceCallback<void(const absl::optional<AmbientSettings>& settings)>;
   using UpdateSettingsCallback = base::OnceCallback<void(bool success)>;
@@ -106,9 +108,6 @@
   using FetchWeatherCallback =
       base::OnceCallback<void(const absl::optional<WeatherInfo>& weather_info)>;
 
-  using GetGooglePhotosAlbumsPreviewCallback =
-      base::OnceCallback<void(const std::vector<GURL>& preview_urls)>;
-
   static AmbientBackendController* Get();
 
   AmbientBackendController();
@@ -132,6 +131,8 @@
       const gfx::Size& screen_size,
       OnScreenUpdateInfoFetchedCallback callback) = 0;
 
+  virtual void FetchPreviewImages(OnPreviewImagesFetchedCallback callback) = 0;
+
   // Get ambient mode Settings from server.
   virtual void GetSettings(GetSettingsCallback callback) = 0;
 
@@ -159,7 +160,7 @@
       int preview_width,
       int preview_height,
       int num_previews,
-      GetGooglePhotosAlbumsPreviewCallback callback) = 0;
+      OnPreviewImagesFetchedCallback callback) = 0;
 
   // Get stock photo urls to cache in advance in case Ambient mode is started
   // without internet access.
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
index 50ec777..cdcbcfeb 100644
--- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
+++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
@@ -128,6 +128,14 @@
       FROM_HERE, base::BindOnce(std::move(callback), update));
 }
 
+void FakeAmbientBackendControllerImpl::FetchPreviewImages(
+    OnPreviewImagesFetchedCallback callback) {
+  std::vector<GURL> urls = {GURL(kFakeUrl)};
+  // Pretend to respond asynchronously.
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), urls));
+}
+
 void FakeAmbientBackendControllerImpl::GetSettings(
     GetSettingsCallback callback) {
   // Pretend to respond asynchronously.
@@ -172,7 +180,7 @@
     int preview_width,
     int preview_height,
     int num_previews,
-    GetGooglePhotosAlbumsPreviewCallback callback) {
+    OnPreviewImagesFetchedCallback callback) {
   std::move(callback).Run({GURL("http://example.com/0")});
 }
 
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
index b912335..a9efe51 100644
--- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
+++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
@@ -31,6 +31,7 @@
       bool show_pair_personal_portraits,
       const gfx::Size& screen_size,
       OnScreenUpdateInfoFetchedCallback callback) override;
+  void FetchPreviewImages(OnPreviewImagesFetchedCallback callback) override;
   void GetSettings(GetSettingsCallback callback) override;
   void UpdateSettings(const AmbientSettings& settings,
                       UpdateSettingsCallback callback) override;
@@ -50,7 +51,7 @@
       int preview_width,
       int preview_height,
       int num_previews,
-      GetGooglePhotosAlbumsPreviewCallback callback) override;
+      OnPreviewImagesFetchedCallback callback) override;
   const std::array<const char*, 2>& GetBackupPhotoUrls() const override;
 
   // Simulate to reply the request of FetchSettingsAndAlbums().
diff --git a/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.cc b/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.cc
index 18683d4..50480b8 100644
--- a/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.cc
+++ b/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.cc
@@ -37,6 +37,13 @@
   FastPairRepository::Get()->EvictDeviceImages(mac_address);
 }
 
+void FastPairBluetoothConfigDelegate::UpdateDeviceNickname(
+    const std::string& mac_address,
+    const std::string& nickname) {
+  FastPairRepository::Get()->UpdateAssociatedDeviceFootprintsName(
+      mac_address, nickname, /*cache_may_be_stale=*/true);
+}
+
 void FastPairBluetoothConfigDelegate::SetAdapterStateController(
     bluetooth_config::AdapterStateController* adapter_state_controller) {
   adapter_state_controller_ = adapter_state_controller;
diff --git a/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.h b/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.h
index b0e6b38e..caf859c 100644
--- a/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.h
+++ b/ash/quick_pair/keyed_service/fast_pair_bluetooth_config_delegate.h
@@ -44,6 +44,8 @@
   absl::optional<bluetooth_config::DeviceImageInfo> GetDeviceImageInfo(
       const std::string& device_id) override;
   void ForgetDevice(const std::string& mac_address) override;
+  void UpdateDeviceNickname(const std::string& mac_address,
+                            const std::string& nickname) override;
   void SetAdapterStateController(bluetooth_config::AdapterStateController*
                                      adapter_state_controller) override;
   void SetDeviceNameManager(
diff --git a/ash/quick_pair/repository/fake_fast_pair_repository.cc b/ash/quick_pair/repository/fake_fast_pair_repository.cc
index 7a202f1..99a2690 100644
--- a/ash/quick_pair/repository/fake_fast_pair_repository.cc
+++ b/ash/quick_pair/repository/fake_fast_pair_repository.cc
@@ -125,6 +125,13 @@
   std::move(callback).Run(/*success=*/false);
 }
 
+void FakeFastPairRepository::UpdateAssociatedDeviceFootprintsName(
+    const std::string& mac_address,
+    const std::string& display_name,
+    bool cache_may_be_stale) {
+  saved_display_names_.insert_or_assign(mac_address, display_name);
+}
+
 void FakeFastPairRepository::UpdateOptInStatus(
     nearby::fastpair::OptInStatus opt_in_status,
     UpdateOptInStatusCallback callback) {
diff --git a/ash/quick_pair/repository/fake_fast_pair_repository.h b/ash/quick_pair/repository/fake_fast_pair_repository.h
index 3c08aa8..08505a23 100644
--- a/ash/quick_pair/repository/fake_fast_pair_repository.h
+++ b/ash/quick_pair/repository/fake_fast_pair_repository.h
@@ -70,6 +70,10 @@
       scoped_refptr<Device> device) override;
   void DeleteAssociatedDevice(const std::string& mac_address,
                               DeleteAssociatedDeviceCallback callback) override;
+  void UpdateAssociatedDeviceFootprintsName(const std::string& mac_address,
+                                            const std::string& display_name,
+                                            bool cache_may_be_stale) override;
+
   void FetchDeviceImages(scoped_refptr<Device> device) override;
   absl::optional<std::string> GetDeviceDisplayNameFromCache(
       std::vector<uint8_t> account_key) override;
diff --git a/ash/quick_pair/repository/fast_pair_repository.h b/ash/quick_pair/repository/fast_pair_repository.h
index 17840b9..b169144 100644
--- a/ash/quick_pair/repository/fast_pair_repository.h
+++ b/ash/quick_pair/repository/fast_pair_repository.h
@@ -90,6 +90,15 @@
       const std::string& mac_address,
       DeleteAssociatedDeviceCallback callback) = 0;
 
+  // Updates the display name of the device saved on the Footprints server. The
+  // function will first check the cache for the device, if the device is not
+  // found in the cache and |cache_may_be_stale| is set to true, it will trigger
+  // a server call to refresh the cache.
+  virtual void UpdateAssociatedDeviceFootprintsName(
+      const std::string& mac_address,
+      const std::string& nickname,
+      bool cache_may_be_stale) = 0;
+
   // Deletes the associated data for a given |account_key|.
   // Runs true if a delete is successful for this account key, false
   // otherwise on |callback|.
diff --git a/ash/quick_pair/repository/fast_pair_repository_impl.cc b/ash/quick_pair/repository/fast_pair_repository_impl.cc
index 9944e43..dda086610 100644
--- a/ash/quick_pair/repository/fast_pair_repository_impl.cc
+++ b/ash/quick_pair/repository/fast_pair_repository_impl.cc
@@ -20,6 +20,8 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/ash/services/bluetooth_config/public/cpp/device_image_info.h"
@@ -274,9 +276,10 @@
       continue;
     }
 
-    const std::string& string_key = info.device().account_key();
-    const std::vector<uint8_t> binary_key(string_key.begin(), string_key.end());
-    if (account_key_filter.IsAccountKeyInFilter(binary_key)) {
+    const std::string& device_account_key_str = info.device().account_key();
+    const std::vector<uint8_t> key_bytes(device_account_key_str.begin(),
+                                         device_account_key_str.end());
+    if (account_key_filter.IsAccountKeyInFilter(key_bytes)) {
       nearby::fastpair::StoredDiscoveryItem device;
       if (device.ParseFromString(info.device().discovery_item_bytes())) {
         QP_LOG(INFO) << "Account key matched with a paired device: "
@@ -285,7 +288,7 @@
             device.id(),
             base::BindOnce(&FastPairRepositoryImpl::CompleteAccountKeyLookup,
                            weak_ptr_factory_.GetWeakPtr(), std::move(callback),
-                           std::move(binary_key)));
+                           key_bytes));
         return;
       }
     }
@@ -565,6 +568,81 @@
                      std::move(callback)));
 }
 
+void FastPairRepositoryImpl::UpdateAssociatedDeviceFootprintsName(
+    const std::string& mac_address,
+    const std::string& display_name,
+    bool cache_may_be_stale) {
+  absl::optional<const std::vector<uint8_t>> account_key =
+      saved_device_registry_->GetAccountKey(mac_address);
+  if (!account_key.has_value()) {
+    // If the device does not have an account key it must not be saved. If the
+    // device was not saved, there is nothing to update. Log a warning and
+    // return.
+    QP_LOG(WARNING) << __func__ << ": No saved account key.";
+    return;
+  }
+  std::string account_key_str =
+      std::string(account_key->begin(), account_key->end());
+
+  QP_LOG(VERBOSE) << __func__
+                  << ": changing device display name to: " << display_name;
+
+  // First check if the device is already in |user_devices_cache_| before
+  // querying the server for it.
+  for (const auto& info : user_devices_cache_.fast_pair_info()) {
+    if (!info.has_device()) {
+      continue;
+    }
+    const std::string& device_account_key_str = info.device().account_key();
+
+    if (account_key_str == device_account_key_str) {
+      nearby::fastpair::StoredDiscoveryItem item;
+      item.ParseFromString(info.device().discovery_item_bytes());
+
+      // Write to Footprints with the new device name.
+      GetDeviceMetadata(
+          item.id(),
+          base::BindOnce(&FastPairRepositoryImpl::
+                             WriteAccountAssociationToFootprintsWithMetadata,
+                         weak_ptr_factory_.GetWeakPtr(), item.id(), mac_address,
+                         display_name, account_key.value(),
+                         /*device_protocol=*/absl::nullopt));
+
+      // Update |footprints_last_updated_| to make the cache invalid after the
+      // name change.
+      footprints_last_updated_ = base::Time();
+      return;
+    }
+  }
+
+  // If it's our first time through, then |cache_may_be_stale| will be set to
+  // true in which case we refresh the cache and try again.
+  if (cache_may_be_stale) {
+    footprints_fetcher_->GetUserDevices(base::BindOnce(
+        &FastPairRepositoryImpl::UpdateCacheAndRetryChangeDisplayName,
+        weak_ptr_factory_.GetWeakPtr(), mac_address, display_name));
+  }
+}
+
+void FastPairRepositoryImpl::UpdateCacheAndRetryChangeDisplayName(
+    const std::string& mac_address,
+    const std::string& display_name,
+    absl::optional<nearby::fastpair::UserReadDevicesResponse> user_devices) {
+  QP_LOG(INFO) << __func__;
+  if (user_devices) {
+    UpdateUserDevicesCache(user_devices);
+  } else {
+    QP_LOG(WARNING) << __func__ << ": Failed to update user devices cache.";
+    return;
+  }
+
+  // Perform the retry. The cache has now been refreshed so set
+  // |cache_may_be_stale| to false to prevent calling this function again,
+  // infinitely.
+  FastPairRepositoryImpl::UpdateAssociatedDeviceFootprintsName(
+      mac_address, display_name, /*cache_may_be_stale=*/false);
+}
+
 void FastPairRepositoryImpl::OnDeleteAssociatedDevice(
     const std::string& mac_address,
     DeleteAssociatedDeviceCallback callback,
@@ -803,7 +881,7 @@
       return item.title();
     }
   }
-  return nullptr;
+  return absl::nullopt;
 }
 
 void FastPairRepositoryImpl::CompleteFetchDeviceImages(
diff --git a/ash/quick_pair/repository/fast_pair_repository_impl.h b/ash/quick_pair/repository/fast_pair_repository_impl.h
index 485216b..85387e0 100644
--- a/ash/quick_pair/repository/fast_pair_repository_impl.h
+++ b/ash/quick_pair/repository/fast_pair_repository_impl.h
@@ -75,6 +75,9 @@
       scoped_refptr<Device> device) override;
   void DeleteAssociatedDevice(const std::string& mac_address,
                               DeleteAssociatedDeviceCallback callback) override;
+  void UpdateAssociatedDeviceFootprintsName(const std::string& mac_address,
+                                            const std::string& display_name,
+                                            bool cache_may_be_stale) override;
   void DeleteAssociatedDeviceByAccountKey(
       const std::vector<uint8_t>& account_key,
       DeleteAssociatedDeviceByAccountKeyCallback callback) override;
@@ -116,6 +119,12 @@
       const AccountKeyFilter& account_key_filter,
       CheckAccountKeysCallback callback,
       absl::optional<nearby::fastpair::UserReadDevicesResponse> user_devices);
+
+  void UpdateCacheAndRetryChangeDisplayName(
+      const std::string& mac_address,
+      const std::string& display_name,
+      absl::optional<nearby::fastpair::UserReadDevicesResponse> user_devices);
+
   void UpdateUserDevicesCache(
       absl::optional<nearby::fastpair::UserReadDevicesResponse> user_devices);
   void CompleteAccountKeyLookup(CheckAccountKeysCallback callback,
diff --git a/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc b/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc
index f7a1b58..abc13a90 100644
--- a/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc
+++ b/ash/quick_pair/repository/fast_pair_repository_impl_unittest.cc
@@ -51,6 +51,7 @@
 constexpr char kValidModelId[] = "abc";
 constexpr char kInvalidModelId[] = "666";
 constexpr char kDeviceDisplayName[] = "test_nickname";
+constexpr char kDeviceDisplayName2[] = "second_test_nickname";
 constexpr char kTestModelId[] = "test_model_id";
 constexpr char kTestDeviceId[] = "test_ble_device_id";
 constexpr char kTestBLEAddress[] = "00:11:22:33:45:11";
@@ -449,22 +450,22 @@
 
   auto run_loop = base::RunLoop();
 
-  // Check for the device, this will also load the device into the cache
+  // Check for the device, this will also load the device into the cache.
   fast_pair_repository_->CheckAccountKeys(
       filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
                              base::Unretained(this), run_loop.QuitClosure(),
                              /*expected_result=*/true));
 
   // Remove the device directly from footprints. This is equivalent to the
-  // device being removed on an Android phone or another Chromebook
+  // device being removed on an Android phone or another Chromebook.
   footprints_fetcher_->DeleteUserDevice(base::HexEncode(kAccountKey1),
                                         base::DoNothing());
 
-  // Set the response to replicate an error getting devices from the server
+  // Set the response to replicate an error getting devices from the server.
   footprints_fetcher_->SetGetUserDevicesResponse(absl::nullopt);
 
   // After >30 minutes, cache is stale but we will fail to get devices from
-  // the server so we use the stale cache with the device still present
+  // the server so we use the stale cache with the device still present.
   task_environment()->FastForwardBy(base::Minutes(31));
   fast_pair_repository_->CheckAccountKeys(
       filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
@@ -483,6 +484,7 @@
   device->set_classic_address(kTestClassicAddress1);
   device->set_account_key(kAccountKey1);
   device->set_display_name(kDeviceDisplayName);
+  fast_pair_repository_->WriteAccountAssociationToLocalRegistry(device);
   fast_pair_repository_->WriteAccountAssociationToFootprints(device,
                                                              kAccountKey1);
   base::RunLoop().RunUntilIdle();
@@ -502,6 +504,109 @@
   ASSERT_EQ(kDeviceDisplayName, device->display_name());
 }
 
+TEST_F(FastPairRepositoryImplTest, ChangeDeviceNameFromCache) {
+  AccountKeyFilter filter(kFilterBytes1, {salt});
+  nearby::fastpair::GetObservedDeviceResponse response;
+  DeviceMetadata metadata(response, gfx::Image());
+
+  auto device = base::MakeRefCounted<Device>(kValidModelId, kTestBLEAddress,
+                                             Protocol::kFastPairInitial);
+  device->set_classic_address(kTestClassicAddress1);
+  device->set_account_key(kAccountKey1);
+  device->set_display_name(kDeviceDisplayName);
+  fast_pair_repository_->WriteAccountAssociationToLocalRegistry(device);
+  fast_pair_repository_->WriteAccountAssociationToFootprints(device,
+                                                             kAccountKey1);
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1));
+  ASSERT_TRUE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1));
+
+  auto run_loop = base::RunLoop();
+
+  // Check for the device, this will load the device into the cache.
+  fast_pair_repository_->CheckAccountKeys(
+      filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
+                             base::Unretained(this), run_loop.QuitClosure(),
+                             /*expected_result=*/true));
+
+  device->set_display_name(fast_pair_repository_->GetDeviceDisplayNameFromCache(
+      device->account_key().value()));
+  ASSERT_EQ(device->display_name(), kDeviceDisplayName);
+
+  fast_pair_repository_->UpdateAssociatedDeviceFootprintsName(
+      kTestClassicAddress1, kDeviceDisplayName2, /*cache_may_be_stale=*/true);
+
+  // Check for the device, this will load the device into the cache.
+  fast_pair_repository_->CheckAccountKeys(
+      filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
+                             base::Unretained(this), run_loop.QuitClosure(),
+                             /*expected_result=*/true));
+
+  device->set_display_name(fast_pair_repository_->GetDeviceDisplayNameFromCache(
+      device->account_key().value()));
+  ASSERT_EQ(device->display_name(), kDeviceDisplayName2);
+}
+
+TEST_F(FastPairRepositoryImplTest, ChangeDeviceNameNotInCache) {
+  AccountKeyFilter filter(kFilterBytes1, {salt});
+  nearby::fastpair::GetObservedDeviceResponse response;
+  DeviceMetadata metadata(response, gfx::Image());
+
+  auto device = base::MakeRefCounted<Device>(kValidModelId, kTestBLEAddress,
+                                             Protocol::kFastPairInitial);
+  device->set_classic_address(kTestClassicAddress1);
+  device->set_account_key(kAccountKey1);
+  device->set_display_name(kDeviceDisplayName);
+  fast_pair_repository_->WriteAccountAssociationToLocalRegistry(device);
+  fast_pair_repository_->WriteAccountAssociationToFootprints(device,
+                                                             kAccountKey1);
+  base::RunLoop().RunUntilIdle();
+  ASSERT_TRUE(footprints_fetcher_->ContainsKey(kAccountKey1));
+  ASSERT_TRUE(
+      saved_device_registry_->IsAccountKeySavedToRegistry(kAccountKey1));
+
+  auto run_loop = base::RunLoop();
+
+  fast_pair_repository_->UpdateAssociatedDeviceFootprintsName(
+      kTestClassicAddress1, kDeviceDisplayName2, /*cache_may_be_stale=*/true);
+  base::RunLoop().RunUntilIdle();
+
+  // Check for the device, this will load the device into the cache.
+  fast_pair_repository_->CheckAccountKeys(
+      filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
+                             base::Unretained(this), run_loop.QuitClosure(),
+                             /*expected_result=*/true));
+  base::RunLoop().RunUntilIdle();
+  device->set_display_name(fast_pair_repository_->GetDeviceDisplayNameFromCache(
+      device->account_key().value()));
+  ASSERT_EQ(device->display_name(), kDeviceDisplayName2);
+}
+
+TEST_F(FastPairRepositoryImplTest,
+       UpdateAssociatedDeviceFootprintsName_No_Matching_Account_key) {
+  AccountKeyFilter filter(kFilterBytes1, {salt});
+
+  auto device = base::MakeRefCounted<Device>(kValidModelId, kTestBLEAddress,
+                                             Protocol::kFastPairInitial);
+  device->set_classic_address(kTestClassicAddress1);
+  device->set_account_key(kAccountKey1);
+  fast_pair_repository_->UpdateAssociatedDeviceFootprintsName(
+      kTestClassicAddress1, kDeviceDisplayName2, /*cache_may_be_stale=*/true);
+  base::RunLoop().RunUntilIdle();
+
+  auto run_loop = base::RunLoop();
+
+  // Check for the device, this will load the device into the cache.
+  fast_pair_repository_->CheckAccountKeys(
+      filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
+                             base::Unretained(this), run_loop.QuitClosure(),
+                             /*expected_result=*/false));
+
+  device->set_display_name(fast_pair_repository_->GetDeviceDisplayNameFromCache(
+      device->account_key().value()));
+}
+
 TEST_F(FastPairRepositoryImplTest, LocalRemoveDeviceUpdatesCache) {
   AccountKeyFilter filter(kFilterBytes1, {salt});
   nearby::fastpair::GetObservedDeviceResponse response;
@@ -522,7 +627,7 @@
 
   auto run_loop = base::RunLoop();
 
-  // Check for the device, this will also load the device into the cache
+  // Check for the device, this will also load the device into the cache.
   fast_pair_repository_->CheckAccountKeys(
       filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
                              base::Unretained(this), run_loop.QuitClosure(),
@@ -601,14 +706,14 @@
 
   auto run_loop = base::RunLoop();
 
-  // Check for the device, this will load the device into the cache
+  // Check for the device, this will load the device into the cache.
   fast_pair_repository_->CheckAccountKeys(
       filter, base::BindOnce(&FastPairRepositoryImplTest::VerifyAccountKeyCheck,
                              base::Unretained(this), run_loop.QuitClosure(),
                              /*expected_result=*/true));
   run_loop.Run();
 
-  // Device Account Key is set for testing purposes only
+  // Device Account Key is set for testing purposes only.
   device->set_account_key(kAccountKey1);
   device->set_display_name(fast_pair_repository_->GetDeviceDisplayNameFromCache(
       device->account_key().value()));
@@ -729,6 +834,7 @@
 
   base::MockCallback<base::OnceCallback<void(bool)>> callback;
   EXPECT_CALL(callback, Run(testing::Eq(false))).Times(1);
+
   // Mock an error due to Network failure.
   footprints_fetcher_->SetDeleteUserDeviceResult(false);
   fast_pair_repository_->DeleteAssociatedDevice(
@@ -800,6 +906,7 @@
 
   base::MockCallback<base::OnceCallback<void(bool)>> callback;
   EXPECT_CALL(callback, Run(testing::Eq(false))).Times(1);
+
   // Mock an error due to Network failure.
   footprints_fetcher_->SetDeleteUserDeviceResult(false);
   fast_pair_repository_->DeleteAssociatedDevice(
@@ -869,6 +976,7 @@
 
   base::MockCallback<base::OnceCallback<void(bool)>> callback1;
   EXPECT_CALL(callback1, Run(testing::Eq(false))).Times(1);
+
   // Mock an error due to Network failure for device1.
   footprints_fetcher_->SetDeleteUserDeviceResult(false);
   fast_pair_repository_->DeleteAssociatedDevice(kTestClassicAddress1,
@@ -883,6 +991,7 @@
 
   base::MockCallback<base::OnceCallback<void(bool)>> callback2;
   EXPECT_CALL(callback2, Run(testing::Eq(false))).Times(1);
+
   // Mock an error due to Network failure for device2.
   footprints_fetcher_->SetDeleteUserDeviceResult(false);
   fast_pair_repository_->DeleteAssociatedDevice(kTestClassicAddress2,
diff --git a/ash/quick_pair/repository/mock_fast_pair_repository.h b/ash/quick_pair/repository/mock_fast_pair_repository.h
index 05be38b..3c6f02a 100644
--- a/ash/quick_pair/repository/mock_fast_pair_repository.h
+++ b/ash/quick_pair/repository/mock_fast_pair_repository.h
@@ -45,6 +45,12 @@
                DeleteAssociatedDeviceCallback callback),
               (override));
   MOCK_METHOD(void,
+              UpdateAssociatedDeviceFootprintsName,
+              (const std::string& mac_address,
+               const std::string& display_name,
+               bool retry),
+              (override));
+  MOCK_METHOD(void,
               FetchDeviceImages,
               (scoped_refptr<Device> device),
               (override));
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index e16afa31..7f1e79f5 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -296,6 +296,7 @@
     "shelf_back.icon",
     "shelf_browse_as_guest_button.icon",
     "shelf_cancel_button.icon",
+    "shelf_enterprise.icon",
     "shelf_globe.icon",
     "shelf_keyboard.icon",
     "shelf_keyboard_newui.icon",
diff --git a/ash/resources/vector_icons/shelf_enterprise.icon b/ash/resources/vector_icons/shelf_enterprise.icon
new file mode 100644
index 0000000..92588246
--- /dev/null
+++ b/ash/resources/vector_icons/shelf_enterprise.icon
@@ -0,0 +1,59 @@
+// 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.
+
+CANVAS_DIMENSIONS, 20,
+MOVE_TO, 2, 17,
+V_LINE_TO, 3,
+H_LINE_TO, 12,
+V_LINE_TO, 7,
+H_LINE_TO, 18,
+V_LINE_TO, 17,
+H_LINE_TO, 2,
+CLOSE,
+MOVE_TO, 8, 9,
+H_LINE_TO, 10,
+V_LINE_TO, 11,
+H_LINE_TO, 8,
+V_LINE_TO, 9,
+CLOSE,
+MOVE_TO, 12, 11,
+H_LINE_TO, 14,
+V_LINE_TO, 13,
+H_LINE_TO, 12,
+V_LINE_TO, 15,
+H_LINE_TO, 16,
+V_LINE_TO, 9,
+H_LINE_TO, 12,
+V_LINE_TO, 11,
+CLOSE,
+MOVE_TO, 8, 13,
+H_LINE_TO, 10,
+V_LINE_TO, 15,
+H_LINE_TO, 8,
+V_LINE_TO, 13,
+CLOSE,
+MOVE_TO, 6, 13,
+H_LINE_TO, 4,
+V_LINE_TO, 15,
+H_LINE_TO, 6,
+V_LINE_TO, 13,
+CLOSE,
+MOVE_TO, 6, 9,
+H_LINE_TO, 4,
+V_LINE_TO, 11,
+H_LINE_TO, 6,
+V_LINE_TO, 9,
+CLOSE,
+MOVE_TO, 8, 5,
+H_LINE_TO, 10,
+V_LINE_TO, 7,
+H_LINE_TO, 8,
+V_LINE_TO, 5,
+CLOSE,
+MOVE_TO, 6, 5,
+H_LINE_TO, 4,
+V_LINE_TO, 7,
+H_LINE_TO, 6,
+V_LINE_TO, 5,
+CLOSE
\ No newline at end of file
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc
index dd4903e6..db49b481 100644
--- a/ash/shelf/login_shelf_view.cc
+++ b/ash/shelf/login_shelf_view.cc
@@ -567,7 +567,7 @@
                  &LoginScreenController::HandleAccelerator,
                  base::Unretained(Shell::Get()->login_screen_controller()),
                  ash::LoginAcceleratorAction::kStartEnrollment),
-             IDS_ASH_ENTERPRISE_ENROLLMENT_BUTTON, chromeos::kEnterpriseIcon);
+             IDS_ASH_ENTERPRISE_ENROLLMENT_BUTTON, kShelfEnterpriseIcon);
   add_button(kSignIn,
              base::BindRepeating(
                  &LoginScreenController::HandleAccelerator,
diff --git a/ash/style/ash_color_id.h b/ash/style/ash_color_id.h
index 38e1242..7ff15fe 100644
--- a/ash/style/ash_color_id.h
+++ b/ash/style/ash_color_id.h
@@ -21,14 +21,7 @@
   E_CPONLY(kColorAshShieldAndBase90) \
   E_CPONLY(kColorAshShieldAndBase95) \
   E_CPONLY(kColorAshShieldAndBaseOpaque) \
-  E_CPONLY(kColorAshShieldAndBase20Light) \
-  E_CPONLY(kColorAshShieldAndBase40Light) \
-  E_CPONLY(kColorAshShieldAndBase60Light) \
   E_CPONLY(kColorAshShieldAndBase80Light) \
-  E_CPONLY(kColorAshInvertedShieldAndBase80Light) \
-  E_CPONLY(kColorAshShieldAndBase90Light) \
-  E_CPONLY(kColorAshShieldAndBase95Light) \
-  E_CPONLY(kColorAshShieldAndBaseOpaqueLight) \
   /* Controls Layer colors. */ \
   E_CPONLY(kColorAshHairlineBorderColor) \
   E_CPONLY(kColorAshControlBackgroundColorActive) \
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc
index dacceaf..757f653 100644
--- a/ash/style/ash_color_mixer.cc
+++ b/ash/style/ash_color_mixer.cc
@@ -83,17 +83,8 @@
   mixer[kColorAshShieldAndBaseOpaque] = {
       SkColorSetA(background_color, SK_AlphaOPAQUE)};
 
-  // TODO(conniekxu): Remove these colorIds when the DarkLightModeEnabled flag
-  // is removed.
-  mixer[kColorAshShieldAndBase20Light] = {SkColorSetA(SK_ColorWHITE, kAlpha20)};
-  mixer[kColorAshShieldAndBase40Light] = {SkColorSetA(SK_ColorWHITE, kAlpha40)};
-  mixer[kColorAshShieldAndBase60Light] = {SkColorSetA(SK_ColorWHITE, kAlpha60)};
+  // TODO(b/270468758): Remove when the last caller has been deleted.
   mixer[kColorAshShieldAndBase80Light] = {SkColorSetA(SK_ColorWHITE, kAlpha80)};
-  mixer[kColorAshInvertedShieldAndBase80Light] = {
-      SkColorSetA(color_utils::InvertColor(SK_ColorWHITE), kAlpha80)};
-  mixer[kColorAshShieldAndBase95Light] = {SkColorSetA(SK_ColorWHITE, kAlpha95)};
-  mixer[kColorAshShieldAndBaseOpaqueLight] = {
-      SkColorSetA(SK_ColorWHITE, SK_AlphaOPAQUE)};
 }
 
 // Mappings of Controls Colors for Material 2.
@@ -263,6 +254,86 @@
       cros_tokens::kCrosSysAppBaseShaded};
   mixer[cros_tokens::kBgColorDroppedElevation2] = {
       cros_tokens::kCrosSysAppBaseShaded};
+
+  mixer[cros_tokens::kRippleColorDark] = {cros_tokens::kCrosSysHoverOnSubtle};
+  mixer[cros_tokens::kRippleColorLight] = {
+      cros_tokens::kCrosSysHoverOnProminent};
+  mixer[cros_tokens::kRippleColorProminent] = {
+      cros_tokens::kCrosSysRipplePrimary};
+
+  mixer[cros_tokens::kSeparatorColor] = {cros_tokens::kCrosSysSeparator};
+  mixer[cros_tokens::kLinkColor] = {cros_tokens::kCrosSysPrimary};
+  mixer[cros_tokens::kAppScrollbarColor] = {cros_tokens::kCrosSysScrollbar};
+  mixer[cros_tokens::kAppScrollbarColorHover] = {
+      cros_tokens::kCrosSysScrollbarHover};
+
+  mixer[cros_tokens::kAppShieldColor] = {cros_tokens::kCrosSysScrim};
+  mixer[cros_tokens::kAppShield20] = {cros_tokens::kCrosSysScrim};
+  mixer[cros_tokens::kAppShield40] = {cros_tokens::kCrosSysScrim};
+  mixer[cros_tokens::kAppShield60] = {cros_tokens::kCrosSysScrim};
+  mixer[cros_tokens::kAppShield80] = {cros_tokens::kCrosSysScrim};
+
+  mixer[cros_tokens::kHighlightColor] = {cros_tokens::kCrosSysHighlightShape};
+  mixer[cros_tokens::kHighlightColorHover] = {
+      cros_tokens::kCrosSysHoverOnSubtle};
+  mixer[cros_tokens::kHighlightColorFocus] = {
+      cros_tokens::kCrosSysRippleNeutralOnSubtle};
+  mixer[cros_tokens::kHighlightColorError] = {
+      cros_tokens::kCrosSysErrorContainer};
+  mixer[cros_tokens::kHighlightColorGreen] = {
+      cros_tokens::kCrosSysPositiveContainer};
+  mixer[cros_tokens::kHighlightColorRed] = {
+      cros_tokens::kCrosSysErrorContainer};
+  mixer[cros_tokens::kHighlightColorYellow] = {
+      cros_tokens::kCrosSysWarningContainer};
+  mixer[cros_tokens::kTextHighlightColor] = {
+      cros_tokens::kCrosSysHighlightText};
+
+  mixer[cros_tokens::kButtonLabelColorSecondary] = {
+      cros_tokens::kCrosSysOnPrimaryContainer};
+  mixer[cros_tokens::kButtonRippleColorSecondary] = {
+      cros_tokens::kCrosSysRipplePrimary};
+  mixer[cros_tokens::kHighlightColor] = {cros_tokens::kCrosSysPrimary};
+  mixer[cros_tokens::kTextfieldBackgroundColor] = {
+      cros_tokens::kCrosSysInputFieldLight};
+  mixer[cros_tokens::kTextfieldLabelColor] = {cros_tokens::kCrosSysOnSurface};
+
+  mixer[cros_tokens::kSliderColorActive] = {cros_tokens::kCrosSysPrimary};
+  mixer[cros_tokens::kSliderTrackColorActive] =
+      ui::SetAlpha(cros_tokens::kCrosSysPrimaryContainer,
+                   0x4C);  // cros.sys.primary-container @ 30%
+  mixer[cros_tokens::kSliderTrackColorInactive] = ui::SetAlpha(
+      cros_tokens::kCrosSysDisabled, 0x4C);  // cros.sys.disabled @ 30%
+  mixer[cros_tokens::kSliderLabelTextColor] = {cros_tokens::kCrosSysOnPrimary};
+  mixer[cros_tokens::kSliderColorInactive] = {cros_tokens::kCrosSysDisabled};
+
+  mixer[cros_tokens::kSwitchKnobColorActive] = {cros_tokens::kCrosSysOnPrimary};
+  mixer[cros_tokens::kSwitchKnobColorInactive] = {
+      cros_tokens::kCrosSysOnSecondary};
+
+  mixer[cros_tokens::kSwitchTrackColorActive] = {cros_tokens::kCrosSysPrimary};
+  mixer[cros_tokens::kSwitchTrackColorInactive] = {
+      cros_tokens::kCrosSysSecondary};
+
+  mixer[cros_tokens::kTooltipLabelColor] = {
+      cros_tokens::kCrosSysInverseOnSurface};
+  mixer[cros_tokens::kTooltipBackgroundColor] = {
+      cros_tokens::kCrosSysOnSurface};
+
+  mixer[cros_tokens::kNudgeLabelColor] = {cros_tokens::kCrosSysOnPrimary};
+  mixer[cros_tokens::kNudgeIconColor] = {cros_tokens::kCrosSysOnPrimary};
+  mixer[cros_tokens::kNudgeBackgroundColor] = {cros_tokens::kCrosSysPrimary};
+
+  mixer[cros_tokens::kMenuLabelColor] = {cros_tokens::kCrosSysOnSurface};
+  mixer[cros_tokens::kMenuIconColor] = {cros_tokens::kCrosSysOnSurface};
+  mixer[cros_tokens::kMenuShortcutColor] = {cros_tokens::kCrosSysSecondary};
+  mixer[cros_tokens::kMenuItemBackgroundHover] = {
+      cros_tokens::kCrosSysHoverOnSubtle};
+
+  // Harmonized Colors
+  mixer[cros_tokens::kColorPositive] = {cros_tokens::kCrosSysPositive};
+  mixer[cros_tokens::kColorWarning] = {cros_tokens::kCrosSysWarning};
+  mixer[cros_tokens::kColorAlert] = {cros_tokens::kCrosSysError};
 }
 
 // Adds the dynamic color palette tokens based on user_color. This is the base
diff --git a/ash/system/message_center/ash_notification_view_pixeltest.cc b/ash/system/message_center/ash_notification_view_pixeltest.cc
index adaedbb..b3f748b 100644
--- a/ash/system/message_center/ash_notification_view_pixeltest.cc
+++ b/ash/system/message_center/ash_notification_view_pixeltest.cc
@@ -24,6 +24,8 @@
 
 namespace {
 
+constexpr char kScreenCaptureNotificationId[] = "capture_mode_notification";
+
 constexpr char kShortTitleString[] = "Short Title";
 constexpr char kMediumTitleString[] = "Test Notification's Multiline Title";
 constexpr char kLongTitleString[] =
@@ -219,13 +221,11 @@
       .Wait();
 
   // Get the notification view.
-  const std::string notification_id =
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(image_file_path);
-
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       base::StrCat({"screen_capture_popup_notification_",
                     GetDisplayTypeName(GetParam())}),
-      /*revision_number=*/0, test_api()->GetPopupViewForId(notification_id)));
+      /*revision_number=*/0,
+      test_api()->GetPopupViewForId(kScreenCaptureNotificationId)));
 }
 
 }  // namespace ash
diff --git a/ash/system/message_center/ash_notification_view_unittest.cc b/ash/system/message_center/ash_notification_view_unittest.cc
index 83e7bd1..9ad892db 100644
--- a/ash/system/message_center/ash_notification_view_unittest.cc
+++ b/ash/system/message_center/ash_notification_view_unittest.cc
@@ -61,6 +61,8 @@
 
 namespace {
 
+constexpr char kScreenCaptureNotificationId[] = "capture_mode_notification";
+
 const gfx::Image CreateTestImage(int width,
                                  int height,
                                  SkColor color = SK_ColorGREEN) {
@@ -1584,9 +1586,6 @@
   const base::FilePath image_file_path = WaitForCaptureFileToBeSaved();
 
   // Get the notification view.
-  const std::string notification_id =
-      capture_mode_util::GetScreenCaptureNotificationIdForPath(image_file_path);
-
   if (IsPopupNotification()) {
     // Wait until the notification popup shows.
     MessagePopupAnimationWaiter(
@@ -1602,7 +1601,8 @@
   // Drag to the center of `widget` then release. Verify that the screenshot
   // image carried by the drag data is handled.
   EXPECT_CALL(drag_drop_delegate(), HandleFilePathData(image_file_path));
-  DragNotificationToWidget(*GetViewForNotificationId(notification_id));
+  DragNotificationToWidget(
+      *GetViewForNotificationId(kScreenCaptureNotificationId));
 }
 
 }  // namespace ash
diff --git a/ash/system/phonehub/phone_hub_recent_apps_view_unittest.cc b/ash/system/phonehub/phone_hub_recent_apps_view_unittest.cc
index 9c41bdca..4e43a75 100644
--- a/ash/system/phonehub/phone_hub_recent_apps_view_unittest.cc
+++ b/ash/system/phonehub/phone_hub_recent_apps_view_unittest.cc
@@ -40,7 +40,8 @@
     AshTestBase::SetUp();
 
     feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kEcheLauncher, features::kEcheSWA},
+        /*enabled_features=*/{features::kEcheLauncher, features::kEcheSWA,
+                              features::kEcheLauncherIconsInMoreAppsButton},
         /*disabled_features=*/{});
 
     phone_hub_recent_apps_view_ = std::make_unique<PhoneHubRecentAppsView>(
@@ -58,13 +59,16 @@
   }
 
   void NotifyRecentAppAddedOrUpdated() {
+    auto app_metadata = phonehub::Notification::AppMetadata(
+        kAppName, kPackageName,
+        /*icon=*/gfx::Image(), /*icon_color =*/absl::nullopt,
+        /*icon_is_monochrome =*/true, kUserId,
+        phonehub::proto::AppStreamabilityStatus::STREAMABLE);
+
     fake_recent_apps_interaction_handler_.NotifyRecentAppAddedOrUpdated(
-        phonehub::Notification::AppMetadata(
-            kAppName, kPackageName,
-            /*icon=*/gfx::Image(), /*icon_color =*/absl::nullopt,
-            /*icon_is_monochrome =*/true, kUserId,
-            phonehub::proto::AppStreamabilityStatus::STREAMABLE),
-        base::Time::Now());
+        app_metadata, base::Time::Now());
+    fake_phone_hub_manager_.fake_app_stream_launcher_data_model()->AddAppToList(
+        app_metadata);
   }
 
   size_t PackageNameToClickCount(const std::string& package_name) {
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc
index 2095f11..ff77c63 100644
--- a/ash/wallpaper/wallpaper_controller_unittest.cc
+++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -185,11 +185,8 @@
     return false;
   }
 
-  size_t bytes_written = base::WriteFile(
-      path, reinterpret_cast<const char*>(&output[0]), output.size());
-  if (bytes_written != output.size()) {
-    LOG(ERROR) << "Wrote " << bytes_written << " byte(s) instead of "
-               << output.size() << " to " << path.value();
+  if (!base::WriteFile(path, output)) {
+    LOG(ERROR) << "Writing to " << path.value() << " failed.";
     return false;
   }
   return true;
diff --git a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
index 212a30e..8c7a004 100644
--- a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
+++ b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
@@ -90,9 +90,7 @@
   }
 
   // Saves |data| to |path| in local file system.
-  size_t written_bytes =
-      base::WriteFile(path, data->front_as<const char>(), data->size());
-  return written_bytes == data->size();
+  return base::WriteFile(path, base::make_span(data->front(), data->size()));
 }
 
 }  // namespace ash
diff --git a/ash/webui/camera_app_ui/resources/js/BUILD.gn b/ash/webui/camera_app_ui/resources/js/BUILD.gn
index 886173a..dfdcf61 100644
--- a/ash/webui/camera_app_ui/resources/js/BUILD.gn
+++ b/ash/webui/camera_app_ui/resources/js/BUILD.gn
@@ -105,11 +105,11 @@
     js_files += rebase_path(get_target_outputs(dep), root_dir, root_build_dir)
   }
 
-  extra_deps += [ "//ui/webui/resources/mojo:library" ]
+  extra_deps += [ "//ui/webui/resources/mojo:build_ts" ]
 }
 
 ts_library("build_ts") {
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
 
   tsconfig_base = "../tsconfig_base.json"
 
diff --git a/ash/webui/color_internals/mojom/BUILD.gn b/ash/webui/color_internals/mojom/BUILD.gn
index 971619e0..8397c13 100644
--- a/ash/webui/color_internals/mojom/BUILD.gn
+++ b/ash/webui/color_internals/mojom/BUILD.gn
@@ -39,7 +39,7 @@
   root_dir = mojom_gen_dir
   out_dir = "$mojom_gen_dir/tsc"
   in_files = [ "color_internals.mojom-webui.js" ]
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
   extra_deps = [ ":mojom_webui_js" ]
   composite = true
 }
diff --git a/ash/webui/color_internals/resources/BUILD.gn b/ash/webui/color_internals/resources/BUILD.gn
index cb62052a..b4c81e6 100644
--- a/ash/webui/color_internals/resources/BUILD.gn
+++ b/ash/webui/color_internals/resources/BUILD.gn
@@ -21,7 +21,7 @@
   deps = [
     "../mojom:mojom_ts",
     "//ui/webui/resources/cr_components/color_change_listener:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   # Allows TSC to check the generated mojom-webui/ directory when it encounters
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn
index b566a53..5db2941d8 100644
--- a/ash/webui/common/resources/BUILD.gn
+++ b/ash/webui/common/resources/BUILD.gn
@@ -357,7 +357,7 @@
   deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_checked_in_dts_files",
diff --git a/ash/webui/common/resources/hotspot/BUILD.gn b/ash/webui/common/resources/hotspot/BUILD.gn
index 9aee74d..03180845 100644
--- a/ash/webui/common/resources/hotspot/BUILD.gn
+++ b/ash/webui/common/resources/hotspot/BUILD.gn
@@ -36,7 +36,7 @@
   definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
   deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_files",
diff --git a/ash/webui/common/resources/hotspot/fake_hotspot_config.ts b/ash/webui/common/resources/hotspot/fake_hotspot_config.ts
index 5e4578fa..f9e37f66 100644
--- a/ash/webui/common/resources/hotspot/fake_hotspot_config.ts
+++ b/ash/webui/common/resources/hotspot/fake_hotspot_config.ts
@@ -5,7 +5,7 @@
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 
-import {CrosHotspotConfigInterface, CrosHotspotConfigObserverRemote, HotspotAllowStatus, HotspotConfig, HotspotControlResult, HotspotInfo, HotspotState, SetHotspotConfigResult} from './cros_hotspot_config.mojom-webui.js';
+import {CrosHotspotConfigInterface, CrosHotspotConfigObserverRemote, HotspotAllowStatus, HotspotConfig, HotspotControlResult, HotspotEnabledStateObserverRemote, HotspotInfo, HotspotState, SetHotspotConfigResult} from './cros_hotspot_config.mojom-webui.js';
 
 /**
  * @fileoverview
@@ -16,6 +16,7 @@
   private methods_: FakeMethodResolver = new FakeMethodResolver();
   private hotspotInfo_: HotspotInfo|null = null;
   private observers_: CrosHotspotConfigObserverRemote[] = [];
+  private stateObservers_: HotspotEnabledStateObserverRemote[] = [];
   private setHotspotConfigResult_: SetHotspotConfigResult|null = null;
   private enableHotspotResult_: HotspotControlResult|null = null;
   private disableHotspotResult_: HotspotControlResult|null = null;
@@ -138,6 +139,11 @@
     this.observers_.push(remote);
   }
 
+  // Implements CrosHotspotConfigInterface.observeEnabledStateChanges()
+  observeEnabledStateChanges(remote: HotspotEnabledStateObserverRemote): void {
+    this.stateObservers_.push(remote);
+  }
+
   // Setup method resolvers.
   registerMethods(): void {
     this.methods_.register('getHotspotInfo');
diff --git a/ash/webui/common/resources/office_fallback/BUILD.gn b/ash/webui/common/resources/office_fallback/BUILD.gn
index d45c3b6..f325d23 100644
--- a/ash/webui/common/resources/office_fallback/BUILD.gn
+++ b/ash/webui/common/resources/office_fallback/BUILD.gn
@@ -24,6 +24,6 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/ash/webui/common/resources/typescript_utils/BUILD.gn b/ash/webui/common/resources/typescript_utils/BUILD.gn
index 986c835..6887081 100644
--- a/ash/webui/common/resources/typescript_utils/BUILD.gn
+++ b/ash/webui/common/resources/typescript_utils/BUILD.gn
@@ -28,7 +28,7 @@
   deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":preprocess",
diff --git a/ash/webui/diagnostics_ui/resources/BUILD.gn b/ash/webui/diagnostics_ui/resources/BUILD.gn
index cee8666..6230a95 100644
--- a/ash/webui/diagnostics_ui/resources/BUILD.gn
+++ b/ash/webui/diagnostics_ui/resources/BUILD.gn
@@ -158,7 +158,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   extra_deps = [
diff --git a/ash/webui/face_ml_app_ui/mojom/BUILD.gn b/ash/webui/face_ml_app_ui/mojom/BUILD.gn
index 8ef7e361..34135c9 100644
--- a/ash/webui/face_ml_app_ui/mojom/BUILD.gn
+++ b/ash/webui/face_ml_app_ui/mojom/BUILD.gn
@@ -24,7 +24,7 @@
   in_files = [ "face_ml_app_ui.mojom-webui.js" ]
 
   # Required for Mojo's bindings.js resolution.
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
 
   # Targets that generate the above .mojom-webui.js files.
   extra_deps = [ ":trusted_webui_js" ]
diff --git a/ash/webui/guest_os_installer/resources/BUILD.gn b/ash/webui/guest_os_installer/resources/BUILD.gn
index 866b9974..7a515ac 100644
--- a/ash/webui/guest_os_installer/resources/BUILD.gn
+++ b/ash/webui/guest_os_installer/resources/BUILD.gn
@@ -19,7 +19,7 @@
 
   ts_deps = [
     "//third_party/polymer/v3_0:library",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index 1d3eadf..e6ae08cd 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -611,9 +611,8 @@
   // Notifies the JS side about the current albums.
   OnAlbumsChanged(array<AmbientModeAlbum> albums);
 
-  // Notifies the JS side about the previews of the selected Google Photos
-  // albums.
-  OnGooglePhotosAlbumsPreviewsFetched(array<url.mojom.Url> previews);
+  // Notifies the JS side about the previews of the selected albums.
+  OnPreviewsFetched(array<url.mojom.Url> previews);
 
   // Notifies the JS side when ambient visibility is changed.
   OnAmbientUiVisibilityChanged(AmbientUiVisibility visibility);
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn
index de5dccc..a559020 100644
--- a/ash/webui/personalization_app/resources/BUILD.gn
+++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -153,7 +153,7 @@
     "//ui/webui/resources/cr_components/localized_link:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_extra_deps = [ "//ash/webui/common/resources:generate_definitions" ]
 
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_actions.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_actions.ts
index 387b391..6916ab3 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_actions.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_actions.ts
@@ -16,15 +16,14 @@
   SET_ALBUM_SELECTED = 'set_album_selected',
   SET_AMBIENT_MODE_ENABLED = 'set_ambient_mode_enabled',
   SET_ANIMATION_THEME = 'set_animation_theme',
-  SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS = 'set_google_photos_albums_previews',
+  SET_PREVIEWS = 'set_previews',
   SET_TEMPERATURE_UNIT = 'set_temperature_unit',
   SET_TOPIC_SOURCE = 'set_topic_source',
   SET_AMBIENT_UI_VISIBILITY = 'set_ambient_ui_visibility',
 }
 
-export type AmbientActions =
-    SetAlbumsAction|SetAlbumSelectedAction|SetAmbientModeEnabledAction|
-    SetAnimationThemeAction|SetGooglePhotosAlbumsPreviewsAction|
+export type AmbientActions = SetAlbumsAction|SetAlbumSelectedAction|
+    SetAmbientModeEnabledAction|SetAnimationThemeAction|SetPreviewsAction|
     SetTopicSourceAction|SetTemperatureUnitAction|SetAmbientUiVisibilityAction;
 
 export type SetAlbumsAction = Action&{
@@ -46,8 +45,8 @@
   animationTheme: AnimationTheme,
 };
 
-export type SetGooglePhotosAlbumsPreviewsAction = Action&{
-  name: AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS,
+export type SetPreviewsAction = Action&{
+  name: AmbientActionName.SET_PREVIEWS,
   previews: Url[],
 };
 
@@ -94,11 +93,10 @@
 }
 
 /**
- * Sets the current value of Google Photos albums previews.
+ * Sets the current value of preview image URLs.
  */
-export function setGooglePhotosAlbumsPreviewsAction(previews: Url[]):
-    SetGooglePhotosAlbumsPreviewsAction {
-  return {name: AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS, previews};
+export function setPreviewsAction(previews: Url[]): SetPreviewsAction {
+  return {name: AmbientActionName.SET_PREVIEWS, previews};
 }
 
 /**
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts
index 153a4f2..c8a8ae9c 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_observer.ts
@@ -5,13 +5,13 @@
 import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
 import {AmbientModeAlbum, AmbientObserverInterface, AmbientObserverReceiver, AmbientProviderInterface, AmbientUiVisibility, AnimationTheme, TemperatureUnit, TopicSource} from '../../personalization_app.mojom-webui.js';
-import {isAmbientModeAllowed} from '../load_time_booleans.js';
+import {isAmbientModeAllowed, isPersonalizationJellyEnabled} from '../load_time_booleans.js';
 import {logGooglePhotosPreviewsLoadTime} from '../personalization_metrics_logger.js';
 import {Paths} from '../personalization_router_element.js';
 import {PersonalizationStore} from '../personalization_store.js';
 import {isNonEmptyArray, isRecentHighlightsAlbum} from '../utils.js';
 
-import {setAlbumsAction, setAmbientModeEnabledAction, setAmbientUiVisibilityAction, setAnimationThemeAction, setGooglePhotosAlbumsPreviewsAction, setTemperatureUnitAction, setTopicSourceAction} from './ambient_actions.js';
+import {setAlbumsAction, setAmbientModeEnabledAction, setAmbientUiVisibilityAction, setAnimationThemeAction, setPreviewsAction, setTemperatureUnitAction, setTopicSourceAction} from './ambient_actions.js';
 import {getAmbientProvider} from './ambient_interface_provider.js';
 
 /** @fileoverview listens for updates on ambient mode changes. */
@@ -107,17 +107,19 @@
     store.dispatch(setAlbumsAction(albums));
   }
 
-  onGooglePhotosAlbumsPreviewsFetched(previews: Url[]) {
+  onPreviewsFetched(previews: Url[]) {
     const store = PersonalizationStore.getInstance();
 
     // Only log performance metrics if this is the first time receiving google
     // photos previews.
+    // TODO(b/245608603): log performance metrics when Jelly is enabled.
     AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance =
+        !isPersonalizationJellyEnabled() &&
         AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance &&
-        (!store.data.ambient.googlePhotosAlbumsPreviews ||
-         store.data.ambient.googlePhotosAlbumsPreviews.length === 0);
+        (!store.data.ambient.previews ||
+         store.data.ambient.previews.length === 0);
 
-    store.dispatch(setGooglePhotosAlbumsPreviewsAction(previews));
+    store.dispatch(setPreviewsAction(previews));
 
     if (AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance &&
         isNonEmptyArray(previews)) {
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_base.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_base.ts
index cdd4a22d..d1999f8 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_base.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_base.ts
@@ -51,10 +51,10 @@
       loading_: {
         type: Boolean,
         computed:
-            'computeLoading_(isAmbientModeAllowed_, ambientModeEnabled_, albums_, topicSource_, googlePhotosAlbumsPreviews_)',
+            'computeLoading_(isAmbientModeAllowed_, ambientModeEnabled_, albums_, topicSource_, previewImages_)',
         observer: 'onLoadingChanged_',
       },
-      googlePhotosAlbumsPreviews_: {
+      previewImages_: {
         type: Array,
         value: null,
       },
@@ -74,7 +74,7 @@
   }
 
   protected ambientModeEnabled_: boolean|null;
-  protected googlePhotosAlbumsPreviews_: Url[]|null;
+  protected previewImages_: Url[]|null;
   protected isPersonalizationJellyEnabled_: boolean;
   protected previewAlbums_: AmbientModeAlbum[]|null;
   protected topicSource_: TopicSource|null;
@@ -96,9 +96,7 @@
     this.watch(
         'ambientModeEnabled_', state => state.ambient.ambientModeEnabled);
     this.watch('albums_', state => state.ambient.albums);
-    this.watch(
-        'googlePhotosAlbumsPreviews_',
-        state => state.ambient.googlePhotosAlbumsPreviews);
+    this.watch('previewImages_', state => state.ambient.previews);
     this.watch('topicSource_', state => state.ambient.topicSource);
     this.updateFromStore();
   }
@@ -106,8 +104,7 @@
   private computeLoading_(): boolean {
     return this.isAmbientModeAllowed_ &&
         (this.ambientModeEnabled_ === null || this.albums_ === null ||
-         this.topicSource_ === null ||
-         this.googlePhotosAlbumsPreviews_ === null);
+         this.topicSource_ === null || this.previewImages_ === null);
   }
 
   private onLoadingChanged_(value: boolean) {
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.ts
index 518554e2..823dec1 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_preview_large_element.ts
@@ -39,14 +39,14 @@
 
   static override get properties() {
     return {
-      googlePhotosAlbumsPreviews_: {
+      previewImages_: {
         type: Array,
         value: null,
       },
       collageImages_: {
         type: Array,
         computed:
-            'computeCollageImages_(topicSource_, previewAlbums_, googlePhotosAlbumsPreviews_)',
+            'computeCollageImages_(topicSource_, previewAlbums_, previewImages_)',
       },
     };
   }
@@ -56,9 +56,9 @@
   /**
    * Return the array of images that form the collage.
    * When topic source is Google Photos:
-   *   - if `googlePhotosAlbumsPreviews_` is non-empty but contains fewer than 4
+   *   - if `previewImages_` is non-empty but contains fewer than 4
    *     images, only return one of them; otherwise return the first 4.
-   *   - if `googlePhotosAlbumsPreviews_` is empty:
+   *   - if `previewImages_` is empty:
    *        - e.g. user selected art gallery albums
    *        - if `previewAlbums_` contains fewer than 4 albums, return one of
    *        their previews; otherwise return the first 4.
@@ -70,14 +70,18 @@
     const maxLength = this.isPersonalizationJellyEnabled_ ? 3 : 4;
     switch (this.topicSource_) {
       case TopicSource.kArtGallery:
+        if (this.isPersonalizationJellyEnabled_ &&
+            isNonEmptyArray(this.previewImages_)) {
+          return this.previewImages_.slice(0, maxLength);
+        }
         return (this.previewAlbums_ || [])
             .map(album => album.url)
             .slice(0, maxLength);
       case TopicSource.kGooglePhotos:
-        if (isNonEmptyArray(this.googlePhotosAlbumsPreviews_)) {
-          return this.googlePhotosAlbumsPreviews_.length < maxLength ?
-              [this.googlePhotosAlbumsPreviews_[0]] :
-              this.googlePhotosAlbumsPreviews_.slice(0, maxLength);
+        if (isNonEmptyArray(this.previewImages_)) {
+          return this.previewImages_.length < maxLength ?
+              [this.previewImages_[0]] :
+              this.previewImages_.slice(0, maxLength);
         }
         if (isNonEmptyArray(this.previewAlbums_)) {
           return this.previewAlbums_.length < maxLength ?
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_reducers.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_reducers.ts
index 878ab772..18f3ed5f 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_reducers.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_reducers.ts
@@ -50,11 +50,11 @@
   }
 }
 
-export function googlePhotosAlbumsPreviewsReducer(
-    state: AmbientState['googlePhotosAlbumsPreviews'], action: Actions,
-    _: PersonalizationState): AmbientState['googlePhotosAlbumsPreviews'] {
+export function previewsReducer(
+    state: AmbientState['previews'], action: Actions,
+    _: PersonalizationState): AmbientState['previews'] {
   switch (action.name) {
-    case AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS:
+    case AmbientActionName.SET_PREVIEWS:
       return action.previews;
     default:
       return state;
@@ -99,7 +99,7 @@
       albums: albumsReducer,
       ambientModeEnabled: ambientModeEnabledReducer,
       animationTheme: animationThemeReducer,
-      googlePhotosAlbumsPreviews: googlePhotosAlbumsPreviewsReducer,
+      previews: previewsReducer,
       temperatureUnit: temperatureUnitReducer,
       topicSource: topicSourceReducer,
       ambientUiVisibility: ambientUiVisibilityReducer,
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_state.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_state.ts
index 12e362e..4c51e88 100644
--- a/ash/webui/personalization_app/resources/js/ambient/ambient_state.ts
+++ b/ash/webui/personalization_app/resources/js/ambient/ambient_state.ts
@@ -13,7 +13,7 @@
   albums: AmbientModeAlbum[]|null;
   ambientModeEnabled: boolean|null;
   animationTheme: AnimationTheme|null;
-  googlePhotosAlbumsPreviews: Url[]|null;
+  previews: Url[]|null;
   temperatureUnit: TemperatureUnit|null;
   topicSource: TopicSource|null;
   ambientUiVisibility: AmbientUiVisibility|null;
@@ -24,7 +24,7 @@
     albums: null,
     ambientModeEnabled: null,
     animationTheme: null,
-    googlePhotosAlbumsPreviews: null,
+    previews: null,
     temperatureUnit: null,
     topicSource: null,
     ambientUiVisibility: null,
diff --git a/ash/webui/personalization_app/resources/js/keyboard_backlight/keyboard_backlight_element.html b/ash/webui/personalization_app/resources/js/keyboard_backlight/keyboard_backlight_element.html
index 91a7dc7b4..6c46956 100644
--- a/ash/webui/personalization_app/resources/js/keyboard_backlight/keyboard_backlight_element.html
+++ b/ash/webui/personalization_app/resources/js/keyboard_backlight/keyboard_backlight_element.html
@@ -207,7 +207,7 @@
     </div>
     <template is="dom-if" if="[[isMultiZoneRgbKeyboardSupported_]]">
       <cr-button id="zoneCustomizationButton" on-click="showZoneCustomizationDialog_"
-          class="primary"
+          class="secondary"
           aria-pressed$="[[getZoneCustomizationButtonAriaPressed_(backlightColor_)]]">
         <iron-icon icon="personalization:circle_checkmark"></iron-icon>
         <div class="text">$i18n{zoneCustomize}</div>
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts
index ecdaa30..dccd7fc 100644
--- a/ash/webui/personalization_app/resources/js/personalization_app.ts
+++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -53,7 +53,7 @@
  */
 export {AlbumList} from './ambient/album_list_element.js';
 export {AlbumsSubpage} from './ambient/albums_subpage_element.js';
-export {AmbientActionName, AmbientActions, SetAlbumsAction, setAlbumsAction, SetAlbumSelectedAction, setAlbumSelectedAction, SetAmbientModeEnabledAction, setAmbientModeEnabledAction, SetAnimationThemeAction, setAnimationThemeAction, SetGooglePhotosAlbumsPreviewsAction, setGooglePhotosAlbumsPreviewsAction, SetTemperatureUnitAction, setTemperatureUnitAction, SetTopicSourceAction, setTopicSourceAction} from './ambient/ambient_actions.js';
+export {AmbientActionName, AmbientActions, SetAlbumsAction, setAlbumsAction, SetAlbumSelectedAction, setAlbumSelectedAction, SetAmbientModeEnabledAction, setAmbientModeEnabledAction, SetAnimationThemeAction, setAnimationThemeAction, SetPreviewsAction, setPreviewsAction, SetTemperatureUnitAction, setTemperatureUnitAction, SetTopicSourceAction, setTopicSourceAction} from './ambient/ambient_actions.js';
 export {setAmbientProviderForTesting} from './ambient/ambient_interface_provider.js';
 export {AmbientObserver} from './ambient/ambient_observer.js';
 export {AmbientPreviewLarge} from './ambient/ambient_preview_large_element.js';
diff --git a/ash/webui/print_management/resources/BUILD.gn b/ash/webui/print_management/resources/BUILD.gn
index 7a4fd06..0f1a97e 100644
--- a/ash/webui/print_management/resources/BUILD.gn
+++ b/ash/webui/print_management/resources/BUILD.gn
@@ -45,7 +45,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   grit_output_dir = "$root_gen_dir/ash/webui"
diff --git a/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn b/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn
index c633de1..e1bd39d1 100644
--- a/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn
+++ b/ash/webui/sample_system_web_app_ui/mojom/BUILD.gn
@@ -56,7 +56,7 @@
   ]
 
   # Required for Mojo's bindings.js resolution.
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
 
   # Targets that generate the above .mojom-webui.js files.
   extra_deps = [
diff --git a/ash/webui/shortcut_customization_ui/resources/BUILD.gn b/ash/webui/shortcut_customization_ui/resources/BUILD.gn
index 7c11cae6..bdf40ba 100644
--- a/ash/webui/shortcut_customization_ui/resources/BUILD.gn
+++ b/ash/webui/shortcut_customization_ui/resources/BUILD.gn
@@ -159,7 +159,7 @@
     js_files += rebase_path(get_target_outputs(dep), root_dir, root_build_dir)
   }
 
-  extra_deps += [ "//ui/webui/resources/mojo:library" ]
+  extra_deps += [ "//ui/webui/resources/mojo:build_ts" ]
 }
 
 ts_library("build_ts") {
@@ -183,7 +183,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   definitions = []
   foreach(file, get_target_outputs(":build_mojo_dts")) {
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index b1cb01f..f639edc 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -2617,8 +2617,10 @@
        ShouldAutomaticallyGroupOnWindowsSnappedInClamshell()) &&
       (state_ == State::kPrimarySnapped ||
        state_ == State::kSecondarySnapped)) {
-    overview_controller->StartOverview(OverviewStartAction::kSplitView,
-                                       OverviewEnterExitType::kNormal);
+    if (!DesksController::Get()->animation()) {
+      overview_controller->StartOverview(OverviewStartAction::kSplitView,
+                                         OverviewEnterExitType::kNormal);
+    }
     return;
   }
 
diff --git a/ash/wm/tablet_mode/tablet_mode_multitask_menu.cc b/ash/wm/tablet_mode/tablet_mode_multitask_menu.cc
index e526efa..bd583c5 100644
--- a/ash/wm/tablet_mode/tablet_mode_multitask_menu.cc
+++ b/ash/wm/tablet_mode/tablet_mode_multitask_menu.cc
@@ -50,7 +50,7 @@
 constexpr int kPaddingNarrow = 6;
 
 // Dogfood feedback button layout values.
-constexpr int kButtonWidth = 130;
+constexpr int kButtonWidth = 120;
 constexpr int kButtonHeight = 28;
 
 // Menu animation values.
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h
index ee17e77..9bb09de8 100644
--- a/base/trace_event/builtin_categories.h
+++ b/base/trace_event/builtin_categories.h
@@ -206,6 +206,7 @@
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug"))                               \
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"))                      \
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug.display_items"))                 \
+  X(TRACE_DISABLED_BY_DEFAULT("cc.debug.lcd_text"))                      \
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug.picture"))                       \
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"))                     \
   X(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"))              \
diff --git a/build/android/pylib/base/base_test_result.py b/build/android/pylib/base/base_test_result.py
index 8a1610e..2c61c383 100644
--- a/build/android/pylib/base/base_test_result.py
+++ b/build/android/pylib/base/base_test_result.py
@@ -82,6 +82,10 @@
     """Get the test name."""
     return self._name
 
+  def GetNameForResultSink(self):
+    """Get the test name to be reported to resultsink."""
+    return self._name
+
   def SetType(self, test_type):
     """Set the test result type."""
     assert test_type in ResultType.GetTypes()
@@ -127,6 +131,10 @@
     """Get dict containing links to test result data."""
     return self._links
 
+  def GetVariantForResultSink(self):  # pylint: disable=no-self-use
+    """Get the variant dict to be reported to result sink."""
+    return None
+
 
 class TestRunResults:
   """Set of results for a test run."""
diff --git a/build/android/pylib/instrumentation/test_result.py b/build/android/pylib/instrumentation/test_result.py
index e7893bfd..52c04b8 100644
--- a/build/android/pylib/instrumentation/test_result.py
+++ b/build/android/pylib/instrumentation/test_result.py
@@ -5,6 +5,9 @@
 
 from pylib.base import base_test_result
 
+# This must match the source adding the suffix: bit.ly/3Zmwwyx
+_MULTIPROCESS_SUFFIX = '__multiprocess_mode'
+
 
 class InstrumentationTestResult(base_test_result.BaseTestResult):
   """Result information for a single instrumentation test."""
@@ -27,6 +30,24 @@
       self._class_name = full_name
       self._test_name = full_name
 
+    self._webview_multiprocess_mode = full_name.endswith(_MULTIPROCESS_SUFFIX)
+
   def SetDuration(self, duration):
     """Set the test duration."""
     self._duration = duration
+
+  def GetNameForResultSink(self):
+    """Get the test name to be reported to resultsink."""
+    raw_name = self.GetName()
+    if self._webview_multiprocess_mode:
+      assert raw_name.endswith(
+          _MULTIPROCESS_SUFFIX
+      ), 'multiprocess mode test raw name should have the corresponding suffix'
+      return raw_name[:-len(_MULTIPROCESS_SUFFIX)]
+    return raw_name
+
+  def GetVariantForResultSink(self):
+    """Get the variant dict to be reported to resultsink."""
+    if self._webview_multiprocess_mode:
+      return {'webview_multiprocess_mode': 'Yes'}
+    return None
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 702a5fb..829885c6 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -920,11 +920,12 @@
                    link_url, test_result.GetName())
   if https_artifacts:
     html_artifact += '<ul>%s</ul>' % '\n'.join(https_artifacts)
-  result_sink_client.Post(test_result.GetName(),
+  result_sink_client.Post(test_result.GetNameForResultSink(),
                           test_result.GetType(),
                           test_result.GetDuration(),
                           log_decoded.encode('utf-8'),
                           test_file_name,
+                          variant=test_result.GetVariantForResultSink(),
                           failure_reason=test_result.GetFailureReason(),
                           html_artifact=html_artifact)
 
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 8062164..dbbc80a3 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-11.20230222.0.1
+11.20230224.3.1
diff --git a/cc/base/list_container.h b/cc/base/list_container.h
index 5752670..b8210f5 100644
--- a/cc/base/list_container.h
+++ b/cc/base/list_container.h
@@ -7,6 +7,7 @@
 
 #include <stddef.h>
 
+#include <iterator>
 #include <memory>
 #include <utility>
 
diff --git a/cc/input/input_handler.cc b/cc/input/input_handler.cc
index b7bee80..c1db2de89 100644
--- a/cc/input/input_handler.cc
+++ b/cc/input/input_handler.cc
@@ -568,12 +568,8 @@
 
 InputHandlerPointerResult InputHandler::MouseMoveAt(
     const gfx::Point& viewport_point) {
-  InputHandlerPointerResult result;
-  if (compositor_delegate_->GetSettings()
-          .compositor_threaded_scrollbar_scrolling) {
-    result =
-        scrollbar_controller_->HandlePointerMove(gfx::PointF(viewport_point));
-  }
+  InputHandlerPointerResult result =
+      scrollbar_controller_->HandlePointerMove(gfx::PointF(viewport_point));
 
   // Early out if there are no animation controllers and avoid the hit test.
   // This happens on platforms without animated scrollbars.
@@ -620,10 +616,7 @@
 }
 
 PointerResultType InputHandler::HitTest(const gfx::PointF& viewport_point) {
-  return compositor_delegate_->GetSettings()
-                 .compositor_threaded_scrollbar_scrolling
-             ? scrollbar_controller_->HitTest(viewport_point)
-             : PointerResultType::kUnhandled;
+  return scrollbar_controller_->HitTest(viewport_point);
 }
 
 InputHandlerPointerResult InputHandler::MouseDown(
@@ -638,15 +631,8 @@
     scroll_element_id_mouse_currently_captured_ =
         scroll_element_id_mouse_currently_over_;
   }
-
-  InputHandlerPointerResult result;
-  if (compositor_delegate_->GetSettings()
-          .compositor_threaded_scrollbar_scrolling) {
-    result = scrollbar_controller_->HandlePointerDown(viewport_point,
-                                                      shift_modifier);
-  }
-
-  return result;
+  return scrollbar_controller_->HandlePointerDown(viewport_point,
+                                                  shift_modifier);
 }
 
 InputHandlerPointerResult InputHandler::MouseUp(
@@ -662,13 +648,7 @@
     if (animation_controller)
       animation_controller->DidMouseUp();
   }
-
-  InputHandlerPointerResult result;
-  if (compositor_delegate_->GetSettings()
-          .compositor_threaded_scrollbar_scrolling)
-    result = scrollbar_controller_->HandlePointerUp(viewport_point);
-
-  return result;
+  return scrollbar_controller_->HandlePointerUp(viewport_point);
 }
 
 void InputHandler::MouseLeave() {
diff --git a/cc/metrics/lcd_text_metrics_reporter.cc b/cc/metrics/lcd_text_metrics_reporter.cc
index 8e571b8..3aff4e22d 100644
--- a/cc/metrics/lcd_text_metrics_reporter.cc
+++ b/cc/metrics/lcd_text_metrics_reporter.cc
@@ -4,9 +4,11 @@
 
 #include "cc/metrics/lcd_text_metrics_reporter.h"
 
+#include "base/functional/function_ref.h"
 #include "base/lazy_instance.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/trace_event/trace_event.h"
 #include "cc/base/histograms.h"
 #include "cc/layers/picture_layer_impl.h"
 #include "cc/paint/display_item_list.h"
@@ -32,6 +34,32 @@
 constexpr char kMetricNameLCDTextLayersLowDPI[] =
     "Compositing.Renderer.LCDTextDisallowedReasonLayers.LowDPI";
 
+void Report(const LayerTreeImpl* layer_tree,
+            base::FunctionRef<void(int text_pixels, LCDTextDisallowedReason)>
+                report_layer) {
+  for (const PictureLayerImpl* layer : layer_tree->picture_layers()) {
+    if (!layer->draws_content() || !layer->GetRasterSource()) {
+      continue;
+    }
+    const scoped_refptr<DisplayItemList>& display_item_list =
+        layer->GetRasterSource()->GetDisplayItemList();
+    if (!display_item_list) {
+      continue;
+    }
+
+    int text_pixels = static_cast<int>(
+        display_item_list->AreaOfDrawText(layer->visible_layer_rect()));
+    if (!text_pixels) {
+      continue;
+    }
+
+    report_layer(text_pixels, layer->lcd_text_disallowed_reason());
+  }
+}
+
+constexpr char const* kTraceCategory =
+    TRACE_DISABLED_BY_DEFAULT("cc.debug.lcd_text");
+
 }  // anonymous namespace
 
 std::unique_ptr<LCDTextMetricsReporter> LCDTextMetricsReporter::CreateIfNeeded(
@@ -53,8 +81,20 @@
     const viz::BeginFrameArgs& args) {
   current_frame_time_ = args.frame_time;
   frame_count_since_last_report_++;
-  if (last_report_frame_time_.is_null())
+  if (last_report_frame_time_.is_null()) {
     last_report_frame_time_ = current_frame_time_;
+  }
+
+  bool trace_enabled;
+  TRACE_EVENT_CATEGORY_GROUP_ENABLED(kTraceCategory, &trace_enabled);
+  if (trace_enabled) {
+    Report(layer_tree_host_impl_->active_tree(),
+           [](int text_pixels, LCDTextDisallowedReason reason) {
+             TRACE_COUNTER2(kTraceCategory,
+                            LCDTextDisallowedReasonToString(reason),
+                            "text_pixels", text_pixels, "layers", 1);
+           });
+  }
 }
 
 void LCDTextMetricsReporter::NotifyPauseFrameProduction() {
@@ -73,31 +113,18 @@
           : layer_tree_host_impl_->active_tree()->device_scale_factor();
   bool is_high_dpi = device_scale_factor >= kHighDPIDeviceScaleFactorThreshold;
 
-  for (const auto* layer :
-       layer_tree_host_impl_->active_tree()->picture_layers()) {
-    if (!layer->draws_content() || !layer->GetRasterSource())
-      continue;
-    const scoped_refptr<DisplayItemList>& display_item_list =
-        layer->GetRasterSource()->GetDisplayItemList();
-    if (!display_item_list)
-      continue;
-
-    int text_pixels = static_cast<int>(
-        display_item_list->AreaOfDrawText(layer->visible_layer_rect()));
-    if (!text_pixels)
-      continue;
-
-    auto reason = layer->lcd_text_disallowed_reason();
-    if (is_high_dpi) {
-      UMA_HISTOGRAM_SCALED_ENUMERATION(kMetricNameLCDTextKPixelsHighDPI, reason,
-                                       text_pixels, 1000);
-      UMA_HISTOGRAM_ENUMERATION(kMetricNameLCDTextLayersHighDPI, reason);
-    } else {
-      UMA_HISTOGRAM_SCALED_ENUMERATION(kMetricNameLCDTextKPixelsLowDPI, reason,
-                                       text_pixels, 1000);
-      UMA_HISTOGRAM_ENUMERATION(kMetricNameLCDTextLayersLowDPI, reason);
-    }
-  }
+  Report(layer_tree_host_impl_->active_tree(),
+         [is_high_dpi](int text_pixels, LCDTextDisallowedReason reason) {
+           if (is_high_dpi) {
+             UMA_HISTOGRAM_SCALED_ENUMERATION(kMetricNameLCDTextKPixelsHighDPI,
+                                              reason, text_pixels, 1000);
+             UMA_HISTOGRAM_ENUMERATION(kMetricNameLCDTextLayersHighDPI, reason);
+           } else {
+             UMA_HISTOGRAM_SCALED_ENUMERATION(kMetricNameLCDTextKPixelsLowDPI,
+                                              reason, text_pixels, 1000);
+             UMA_HISTOGRAM_ENUMERATION(kMetricNameLCDTextLayersLowDPI, reason);
+           }
+         });
 }
 
 }  // namespace cc
diff --git a/cc/test/pixel_test_utils.cc b/cc/test/pixel_test_utils.cc
index 97295cd..20fabb2 100644
--- a/cc/test/pixel_test_utils.cc
+++ b/cc/test/pixel_test_utils.cc
@@ -22,9 +22,7 @@
                                         discard_transparency,
                                         &png_data) &&
       base::CreateDirectory(file_path.DirName())) {
-    char* data = reinterpret_cast<char*>(&png_data[0]);
-    int size = static_cast<int>(png_data.size());
-    return base::WriteFile(file_path, data, size) == size;
+    return base::WriteFile(file_path, png_data);
   }
   return false;
 }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index f62db20..c20e025 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -5237,4 +5237,12 @@
       frame_token, std::move(callbacks));
 }
 
+std::string LayerTreeHostImpl::GetHungCommitDebugInfo() const {
+  return base::StringPrintf(
+      "ptfp%d pwpd%d tmrta%d ", static_cast<int>(pending_tree_fully_painted_),
+      static_cast<int>(paint_worklet_painter_ &&
+                       paint_worklet_painter_->HasOngoingDispatch()),
+      static_cast<int>(tile_manager_.IsReadyToActivate()));
+}
+
 }  // namespace cc
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index de60eb2..a54bb30a 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -915,6 +915,8 @@
     downsample_metrics_ = value;
   }
 
+  std::string GetHungCommitDebugInfo() const;
+
  protected:
   LayerTreeHostImpl(
       const LayerTreeSettings& settings,
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 429c8de..5c2ad78f 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -13832,7 +13832,6 @@
 TEST_P(ScrollUnifiedLayerTreeHostImplTest,
        FadedOutPaintedOverlayScrollbarHitTest) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -13898,7 +13897,6 @@
 // Tests that no scrolls occur when thumb_len equals track_len.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, ScrollOnLargeThumb) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -13958,7 +13956,6 @@
 // for the vertical scrollbar.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, AutoscrollOnDeletedScrollbar) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14058,7 +14055,6 @@
 // ScrollbarController.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, PointerMoveOutOfSequence) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14132,7 +14128,6 @@
 // This tests that faded-out Mac scrollbars can't be interacted with.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, FadedOutPaintedScrollbarHitTest) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14182,7 +14177,6 @@
 TEST_P(ScrollUnifiedLayerTreeHostImplTest,
        SingleGSUForScrollbarThumbDragPerFrame) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14402,7 +14396,6 @@
 // the same frame.
 TEST_F(LayerTreeHostImplTest, AutoscrollTaskAbort) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14475,7 +14468,6 @@
 // Tests that the ScrollbarController handles jump clicks.
 TEST_F(LayerTreeHostImplTest, JumpOnScrollbarClick) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14575,7 +14567,6 @@
 // populated.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, ThumbDragAfterJumpClick) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14655,7 +14646,6 @@
 TEST_P(ScrollUnifiedLayerTreeHostImplTest,
        AbortAnimatedScrollBeforeStartingAutoscroll) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14743,7 +14733,6 @@
 // a mousewheel) wants to animate the scroll offset.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, AnimatedScrollYielding) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14849,7 +14838,6 @@
 // cause the scroller to jump.
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, ThumbDragScrollerLengthIncrease) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
@@ -14947,7 +14935,6 @@
 
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, MainThreadFallback) {
   LayerTreeSettings settings = DefaultSettings();
-  settings.compositor_threaded_scrollbar_scrolling = true;
   CreateHostImpl(settings, CreateLayerTreeFrameSink());
 
   // Setup the viewport.
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 012e0f78..29cd1a8a 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -134,10 +134,6 @@
   // deadlines.
   bool wait_for_all_pipeline_stages_before_draw = false;
 
-  // Determines whether mouse interactions on composited scrollbars are handled
-  // on the compositor thread.
-  bool compositor_threaded_scrollbar_scrolling = true;
-
   // If enabled, the scroll deltas will be a percentage of the target scroller.
   bool percent_based_scrolling = false;
 
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc
index cd241b7..fa6197e 100644
--- a/cc/trees/proxy_impl.cc
+++ b/cc/trees/proxy_impl.cc
@@ -397,7 +397,8 @@
   UMA_HISTOGRAM_BOOLEAN("Compositing.Renderer.CommitHung", true);
   static auto* hung_commit_data = base::debug::AllocateCrashKeyString(
       "hung_commit", base::debug::CrashKeySize::Size256);
-  std::string debug_info = scheduler_->GetHungCommitDebugInfo();
+  std::string debug_info = host_impl_->GetHungCommitDebugInfo() +
+                           scheduler_->GetHungCommitDebugInfo();
   LOG(ERROR) << "commit hung: " << debug_info;
   base::debug::SetCrashKeyString(hung_commit_data, debug_info);
   scheduler_->TraceHungCommitDebugInfo();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index d3006af..b4f77e7 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -1384,9 +1384,11 @@
                 && (mModel.get(index).model.get(TabProperties.THUMBNAIL_FETCHER) == null
                         || forceUpdate || isUpdatingId || forceUpdateLastSelected
                         || forceUpdateColorForSelectableGroup)) {
+            boolean isSelectable = mUiType == UiType.SELECTABLE;
             ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, pseudoTab.getId(),
-                    forceUpdate || forceUpdateLastSelected,
-                    forceUpdate && !TabUiFeatureUtilities.isTabToGtsAnimationEnabled());
+                    (forceUpdate || forceUpdateLastSelected) && !isSelectable,
+                    forceUpdate && !TabUiFeatureUtilities.isTabToGtsAnimationEnabled()
+                            && !isSelectable);
             mModel.get(index).model.set(TabProperties.THUMBNAIL_FETCHER, callback);
         }
     }
@@ -1706,8 +1708,11 @@
         updateFaviconForTab(pseudoTab, null, null);
 
         if (mThumbnailProvider != null && mVisible) {
+            boolean isSelectable = mUiType == UiType.SELECTABLE;
             ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, pseudoTab.getId(),
-                    isSelected, isSelected && !TabUiFeatureUtilities.isTabToGtsAnimationEnabled());
+                    isSelected && !isSelectable,
+                    isSelected && !TabUiFeatureUtilities.isTabToGtsAnimationEnabled()
+                            && !isSelectable);
             tabInfo.set(TabProperties.THUMBNAIL_FETCHER, callback);
         }
         if (pseudoTab.getTab() != null) pseudoTab.getTab().addObserver(mTabObserver);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
index dddc90b6..313f3a87 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -2529,7 +2529,11 @@
                 Profile profile = getCurrentTabModel().getProfile();
                 RequestDesktopUtils.setRequestDesktopSiteContentSettingsForUrl(
                         profile, currentTab.getUrl(), usingDesktopUserAgent);
-                currentTab.reload();
+                // Use TabUtils.switchUserAgent() instead of Tab.reload(). Because we need to reload
+                // with ReloadType::ORIGINAL_REQUEST_URL. See http://crbug/1418587 for details.
+                TabUtils.switchUserAgent(currentTab, usingDesktopUserAgent,
+                        /* forcedByUser */ false,
+                        UseDesktopUserAgentCaller.ON_MENU_OR_KEYBOARD_ACTION);
                 RequestDesktopUtils.maybeShowUserEducationPromptForAppMenuSelection(
                         profile, this, getModalDialogManager());
                 TrackerFactory.getTrackerForProfile(profile).notifyEvent(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTest.java
index cd642f5f..78ec3b0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetTest.java
@@ -7,10 +7,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import static org.chromium.base.test.util.CriteriaHelper.pollUiThread;
 import static org.chromium.chrome.browser.flags.ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE;
@@ -27,7 +24,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.Callback;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
@@ -41,9 +37,7 @@
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.SheetState;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason;
-import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport;
-import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver;
 import org.chromium.components.browser_ui.bottomsheet.TestBottomSheetContent;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
@@ -316,48 +310,6 @@
         assertEquals(endingHeight, mSheetController.getCurrentOffset());
     }
 
-    @Test
-    @MediumTest
-    public void testOffsetController() {
-        mLowPriorityContent.setContentControlsOffset(true);
-
-        BottomSheetObserver forbidStateChanges = new EmptyBottomSheetObserver() {
-            @Override
-            public void onSheetOpened(@StateChangeReason int reason) {
-                fail("onSheetOpened unexpected");
-            }
-
-            @Override
-            public void onSheetClosed(@StateChangeReason int reason) {
-                fail("onSheetClosed unexpected");
-            }
-        };
-        runOnUiThreadBlocking(() -> {
-            assertTrue(mSheetController.requestShowContent(mLowPriorityContent, false));
-
-            Callback<Integer> offsetController = mLowPriorityContent.getOffsetController();
-            assertNotNull(offsetController);
-
-            mSheetController.addObserver(forbidStateChanges);
-
-            int startOffset = mSheetController.getCurrentOffset();
-            int modifiedOffset = startOffset / 2;
-            offsetController.onResult(modifiedOffset);
-            assertEquals(modifiedOffset, mSheetController.getCurrentOffset());
-
-            offsetController.onResult(0);
-            assertEquals(0, mSheetController.getCurrentOffset());
-
-            offsetController.onResult(startOffset);
-            assertEquals(startOffset, mSheetController.getCurrentOffset());
-
-            mSheetController.removeObserver(forbidStateChanges);
-
-            mSheetController.hideContent(mLowPriorityContent, false);
-            assertNull(mLowPriorityContent.getOffsetController());
-        });
-    }
-
     private void hideSheet() {
         runOnUiThreadBlocking(() -> mTestSupport.setSheetState(SheetState.HIDDEN, false));
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
index 38289dc7..61d2dae 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
@@ -128,10 +128,10 @@
         when(mWebContents.getNavigationController()).thenReturn(mNavController);
         when(mNavController.getUseDesktopUserAgent()).thenReturn(false);
 
-        when(DomDistillerUrlUtils.isDistilledPage(MOCK_DISTILLER_URL)).thenReturn(true);
-        when(DomDistillerUrlUtils.isDistilledPage(MOCK_URL)).thenReturn(false);
+        when(mDistillerUrlUtilsJniMock.isDistilledPage(MOCK_DISTILLER_URL.getSpec()))
+                .thenReturn(true);
 
-        when(DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(MOCK_DISTILLER_URL))
+        when(mDistillerUrlUtilsJniMock.getOriginalUrlFromDistillerUrl(MOCK_DISTILLER_URL.getSpec()))
                 .thenReturn(MOCK_URL);
 
         mManager = new ReaderModeManager(mTab, () -> mMessageDispatcher);
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index d51204d74..0f2df09 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -5127,12 +5127,6 @@
   <message name="IDS_EASY_UNLOCK_SCREENLOCK_TOOLTIP_LOGIN_DISABLED" desc="Tooltip for an icon on user's sign-in screen pod shown by EasyUnlock when the feature is only enabled for unlock, not sign-in.">
     To use Smart Lock to sign in to your Google Account, go to Settings &gt; Connected devices &gt; Your phone &gt; Smart Lock.
   </message>
-  <message name="IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_TITLE" desc="Title for notification shown to users who had Sign in with Smart Lock enabled after the Sign in with Smart Lock subfeature is deprecated.">
-    Smart Lock has changed
-  </message>
-  <message name="IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_MESSAGE" desc="Message for notification shown to users who had Sign in with Smart Lock enabled after the Sign in with Smart Lock subfeature is deprecated.">
-    Signing in with Smart Lock is no longer available. You can still unlock with Smart Lock.
-  </message>
   <message name="IDS_SMART_LOCK_SCREENLOCK_TOOLTIP_HARDLOCK_REAUTH_USER" desc="Tooltip text shown on a user's lock screen pod to reauthenticate the user before setting up Smart Lock. A password has to be entered to unlock the device.">
     To set up Smart Lock for Chromebook, Google needs to make sure it’s you—type your password to get started.
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_MESSAGE.png.sha1
deleted file mode 100644
index 445bfc5..0000000
--- a/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_MESSAGE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d44d853b69aa6110ccaa71db8a8b463e05be7c81
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_TITLE.png.sha1
deleted file mode 100644
index 445bfc5..0000000
--- a/chrome/app/chromeos_strings_grdp/IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_TITLE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d44d853b69aa6110ccaa71db8a8b463e05be7c81
\ No newline at end of file
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index e5c488d..ceb3ef8 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -377,12 +377,24 @@
       <message name="IDS_ACCESSIBLE_CANARY_BROWSER_WINDOW_TITLE_FORMAT" desc="The format for the accessible name of a tabbed browser window for the canary (nightly build) channel version of the browser">
         <ph name="PAGE_TITLE">$1<ex>Google</ex></ph> - Chromium Canary
       </message>
-      <message name="IDS_ABOUT_VERSION_COMPANY_NAME" desc="Company name on the about pages">
-        The Chromium Authors
-      </message>
-      <message name="IDS_ABOUT_VERSION_COPYRIGHT" desc="Copyright information on the about pages">
-        Copyright <ph name="YEAR">{0,date,y}<ex>2016</ex></ph> The Chromium Authors. All rights reserved.
-      </message>
+      <if expr="_is_chrome_for_testing_branded">
+        <then>
+          <message name="IDS_ABOUT_VERSION_COMPANY_NAME" desc="Company name on the about pages">
+            Google LLC
+          </message>
+          <message name="IDS_ABOUT_VERSION_COPYRIGHT" desc="Copyright information on the about pages">
+            Copyright <ph name="YEAR">{0,date,y}<ex>2016</ex></ph> Google LLC. All rights reserved.
+          </message>
+        </then>
+        <else>
+          <message name="IDS_ABOUT_VERSION_COMPANY_NAME" desc="Company name on the about pages">
+            The Chromium Authors
+          </message>
+          <message name="IDS_ABOUT_VERSION_COPYRIGHT" desc="Copyright information on the about pages">
+            Copyright <ph name="YEAR">{0,date,y}<ex>2016</ex></ph> The Chromium Authors. All rights reserved.
+          </message>
+        </else>
+      </if>
       <if expr="chromeos_ash">
         <message name="IDS_ABOUT_CROS_VERSION_LICENSE" desc="Additional text displayed beneath the Chromium open source URLs for ChromeOS.">
           ChromiumOS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS">&lt;a target="_blank" href="$1"&gt;</ph>open source software<ph name="END_LINK_CROS_OSS">&lt;/a&gt;</ph>.
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index caeb360..e2bc4697 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7551,6 +7551,9 @@
       <message name="IDS_ALL_NOTES" desc="The text label of a button in the side panel user notes UI, when clicked, takes the user to the notes overviews UI.">
         All Notes
       </message>
+      <message name="IDS_USER_NOTES_CURRENT_TAB_HEADER" desc="A header label in the list of all pages with notes for the current tab if it has notes.">
+        Current Tab
+      </message>
       <message name="IDS_NOTES_COUNT" desc="Text description for the number of notes for a note overview item showing the number of notes on a page">
         {NUM_NOTES, plural, =1 {1 Note} other {# Notes}}
       </message>
diff --git a/chrome/app/generated_resources_grd/IDS_USER_NOTES_CURRENT_TAB_HEADER.png.sha1 b/chrome/app/generated_resources_grd/IDS_USER_NOTES_CURRENT_TAB_HEADER.png.sha1
new file mode 100644
index 0000000..f8810173
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_USER_NOTES_CURRENT_TAB_HEADER.png.sha1
@@ -0,0 +1 @@
+b7be36473f6f44ba7d8956ba899505a27f6f82d3
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index d946760..0a08df3 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1474,6 +1474,9 @@
   <message name="IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_HEADER" desc="Heading for the exceptions list for tab discarding in the performance settings. Tabs will not be discarded by memory saver mode if on a site matching a rule in this list.">
     Always keep these sites active
   </message>
+  <message name="IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADDITIONAL_SITES" desc="Label for button that expands the tab discarding exceptions list to show all entries. Sites added to the list will not be discarded by memory saver.">
+    Additional sites
+  </message>
   <message name="IDS_SETTINGS_BATTERY_PAGE_TITLE" desc="Title of the power section of the performance settings page">
     Power
   </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADDITIONAL_SITES.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADDITIONAL_SITES.png.sha1
new file mode 100644
index 0000000..80468d1
--- /dev/null
+++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADDITIONAL_SITES.png.sha1
@@ -0,0 +1 @@
+556420c87a170686341304b88aa7acf9ed1af9da
\ No newline at end of file
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index e73f774c..16d4a533 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -472,6 +472,7 @@
   # cc/base here, if this is needed these files need to move to base/
   "+cc/base/features.h",
   "+cc/base/switches.h",
+  "+cc/slim/features.h",
 
   # Unsafe to use from //chrome, see http://goo.gl/QQG5wo
   "-content/public/test/test_browser_context.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c253753..1ab8c09 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -228,6 +228,7 @@
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
+#include "cc/slim/features.h"  // nogncheck
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/notifications/chime/android/features.h"
 #include "chrome/browser/push_messaging/push_messaging_features.h"
@@ -3576,12 +3577,6 @@
     {"enable-cros-privacy-hub", flag_descriptions::kCrosPrivacyHubName,
      flag_descriptions::kCrosPrivacyHubDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kCrosPrivacyHub)},
-    {"cryptauth-v2-dedup-device-last-activity-time",
-     flag_descriptions::kCryptAuthV2DedupDeviceLastActivityTimeName,
-     flag_descriptions::kCryptAuthV2DedupDeviceLastActivityTimeDescription,
-     kOsCrOS,
-     FEATURE_VALUE_TYPE(
-         ash::features::kCryptAuthV2DedupDeviceLastActivityTime)},
     {"jelly-colors", flag_descriptions::kJellyColorsName,
      flag_descriptions::kJellyColorsDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kJelly)},
@@ -8615,11 +8610,6 @@
      flag_descriptions::kProjectorDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kProjector)},
 
-    {"enable-projector-exclude-transcript",
-     flag_descriptions::kProjectorExcludeTranscriptName,
-     flag_descriptions::kProjectorExcludeTranscriptDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kProjectorExcludeTranscript)},
-
     {"enable-projector-local-playback",
      flag_descriptions::kProjectorLocalPlaybackName,
      flag_descriptions::kProjectorLocalPlaybackDescription, kOsCrOS,
@@ -9032,14 +9022,6 @@
          kServiceWorkerSkipIgnorableFetchHandlerVariations,
          "ServiceWorkerSkipIgnorableFetchHandler")},
 
-#if BUILDFLAG(IS_ANDROID)
-    {"binding-manager-use-not-perceptible-binding",
-     flag_descriptions::kBindingManagerUseNotPerceptibleBindingName,
-     flag_descriptions::kBindingManagerUseNotPerceptibleBindingDescription,
-     kOsAndroid,
-     FEATURE_VALUE_TYPE(::features::kBindingManagerUseNotPerceptibleBinding)},
-#endif
-
 #if !BUILDFLAG(IS_ANDROID)
     {"password-manager-redesign",
      flag_descriptions::kPasswordManagerRedesignName,
@@ -9367,6 +9349,10 @@
     {"thumbnail-cache-refactor", flag_descriptions::kThumbnailCacheRefactorName,
      flag_descriptions::kThumbnailCacheRefactorDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(thumbnail::kThumbnailCacheRefactor)},
+
+    {"slim-compositor", flag_descriptions::kSlimCompositorName,
+     flag_descriptions::kSlimCompositorDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(features::kSlimCompositor)},
 #endif  // BUILDFLAG(IS_ANDROID)
 
     {"autofill-enable-iban-client-side-url-filtering",
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index 595b419a..d04e91a 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -156,13 +156,6 @@
   // helpers that are unprepared for portal activation to transition them.
   // See https://crbug.com/1042323
   autofill::ChromeAutofillClient::CreateForWebContents(portal_contents);
-  autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      portal_contents,
-      autofill::ChromeAutofillClient::FromWebContents(portal_contents),
-      base::BindRepeating(
-          &autofill::BrowserDriverInitHook,
-          autofill::ChromeAutofillClient::FromWebContents(portal_contents),
-          g_browser_process->GetApplicationLocale()));
   ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
       portal_contents,
       autofill::ChromeAutofillClient::FromWebContents(portal_contents));
diff --git a/chrome/browser/ash/app_mode/kiosk_app_data.cc b/chrome/browser/ash/app_mode/kiosk_app_data.cc
index dd8678e..0e3f91b 100644
--- a/chrome/browser/ash/app_mode/kiosk_app_data.cc
+++ b/chrome/browser/ash/app_mode/kiosk_app_data.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/ash/app_mode/kiosk_app_data_delegate.h"
 #include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/webstore_data_fetcher.h"
 #include "chrome/browser/extensions/webstore_install_helper.h"
 #include "chrome/browser/net/system_network_context_manager.h"
@@ -27,6 +26,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/browser/image_loader.h"
 #include "extensions/browser/sandboxed_unpacker.h"
 #include "extensions/common/constants.h"
diff --git a/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc b/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
index a4e43ebba..1b0b35f3 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
+++ b/chrome/browser/ash/arc/intent_helper/arc_settings_service.cc
@@ -103,8 +103,9 @@
   return !host->empty() && *port;
 }
 
-bool IsProxyAutoDetectionConfigured(const base::Value& proxy_config_dict) {
-  ProxyConfigDictionary dict(proxy_config_dict.GetDict().Clone());
+bool IsProxyAutoDetectionConfigured(
+    const base::Value::Dict& proxy_config_dict) {
+  ProxyConfigDictionary dict(proxy_config_dict.Clone());
   ProxyPrefs::ProxyMode mode;
   dict.GetMode(&mode);
   return mode == ProxyPrefs::MODE_AUTO_DETECT;
@@ -268,8 +269,10 @@
   // Name of the default network. Used to keep track of whether the default
   // network has changed.
   std::string default_network_name_;
+
   // Proxy configuration of the default network.
-  base::Value default_proxy_config_;
+  absl::optional<base::Value::Dict> default_proxy_config_;
+
   // The PAC URL associated with `default_network_name_`, received via the DHCP
   // discovery method.
   GURL dhcp_wpad_url_;
@@ -352,7 +355,7 @@
 // settings with ARC. Proxy changes on the default network are triggered by:
 // - a user changing the proxy in the Network Settings UI;
 // - ONC policy changes;
-// - DHCP settings the WPAD URL via  option 252.
+// - DHCP settings the WPAD URL via option 252.
 void ArcSettingsServiceImpl::DefaultNetworkChanged(
     const ash::NetworkState* network) {
   if (!network)
@@ -363,15 +366,17 @@
   dhcp_wpad_url_ = network->GetWebProxyAutoDiscoveryUrl();
 
   if (IsPrefProxyConfigApplied()) {
-    //  Normally, we would ignore proxy changes coming from the default
-    //  network because the kProxy pref has priority. If the proxy is
-    //  configured to use the Web Proxy Auto-Discovery (WPAD) Protocol via the
-    //  DHCP discovery method, the PAC URL will be propagated to Chrome via the
-    //  default network properties.
-    if (dhcp_wpad_url_changed &&
-        IsProxyAutoDetectionConfigured(
-            GetPrefs()->GetValue(proxy_config::prefs::kProxy))) {
-      SyncProxySettings();
+    //  Normally, we would ignore proxy changes coming from the default network
+    //  because the kProxy pref has priority. If the proxy is configured to use
+    //  the Web Proxy Auto-Discovery (WPAD) Protocol via the DHCP discovery
+    //  method, the PAC URL will be propagated to Chrome via the default network
+    //  properties.
+    if (dhcp_wpad_url_changed) {
+      const base::Value& proxy =
+          GetPrefs()->GetValue(proxy_config::prefs::kProxy);
+      if (proxy.is_dict() && IsProxyAutoDetectionConfigured(proxy.GetDict())) {
+        SyncProxySettings();
+      }
     }
     return;
   }
@@ -380,21 +385,25 @@
   // Trigger a proxy settings sync to ARC if the default network changes.
   if (default_network_name_ != network->name()) {
     default_network_name_ = network->name();
-    default_proxy_config_ = base::Value();
+    default_proxy_config_.reset();
     sync_proxy = true;
   }
   // Trigger a proxy settings sync to ARC if the proxy configuration of the
   // default network changes. Note: this code is only called if kProxy pref is
   // not set.
   if (default_proxy_config_ != network->proxy_config()) {
-    default_proxy_config_ = network->proxy_config().Clone();
+    if (network->proxy_config()) {
+      default_proxy_config_ = network->proxy_config()->Clone();
+    } else {
+      default_proxy_config_.reset();
+    }
     sync_proxy = true;
   }
 
   // Check if proxy auto detection is enabled. If yes, and the PAC URL set via
   // DHCP has changed, propagate the change to ARC.
-  if (!default_proxy_config_.is_none() && dhcp_wpad_url_changed &&
-      IsProxyAutoDetectionConfigured(default_proxy_config_)) {
+  if (default_proxy_config_.has_value() && dhcp_wpad_url_changed &&
+      IsProxyAutoDetectionConfigured(default_proxy_config_.value())) {
     sync_proxy = true;
   }
 
diff --git a/chrome/browser/ash/crosapi/browser_action.cc b/chrome/browser/ash/crosapi/browser_action.cc
index 92cb4b6e..40f05f7b 100644
--- a/chrome/browser/ash/crosapi/browser_action.cc
+++ b/chrome/browser/ash/crosapi/browser_action.cc
@@ -10,7 +10,6 @@
 #include "chrome/browser/ash/crosapi/desk_template_ash.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/profiles/profiles_state.h"
 #include "components/user_manager/user_manager.h"
 
 namespace crosapi {
@@ -394,18 +393,16 @@
 }
 
 // No window will be opened in the following circumstances:
-// 1. Lacros-chrome is initialized in the Kiosk session
+// 1. Lacros-chrome is initialized in the web Kiosk session
 // 2. Full restore is responsible for restoring/launching Lacros.
 // static
 std::unique_ptr<BrowserAction> BrowserAction::GetActionForSessionStart() {
-  if (user_manager::UserManager::Get()->IsLoggedInAsGuest()) {
+  if (user_manager::UserManager::Get()->IsLoggedInAsGuest())
     return std::make_unique<NewWindowAction>(
         /*incognito=*/false, /*should_trigger_session_restore=*/false, -1);
-  }
-  if (profiles::IsKioskSession() ||
-      ash::full_restore::MaybeCreateFullRestoreServiceForLacros()) {
+  if (user_manager::UserManager::Get()->IsLoggedInAsWebKioskApp() ||
+      ash::full_restore::MaybeCreateFullRestoreServiceForLacros())
     return std::make_unique<NoOpAction>();
-  }
   return std::make_unique<NewWindowAction>(
       /*incognito=*/false, /*should_trigger_session_restore=*/true, -1);
 }
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc
index d45963b..2b14823 100644
--- a/chrome/browser/ash/crosapi/browser_manager.cc
+++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -1538,19 +1538,14 @@
     case user_manager::USER_TYPE_KIOSK_APP:
     case user_manager::USER_TYPE_PUBLIC_ACCOUNT:
     case user_manager::USER_TYPE_WEB_KIOSK_APP: {
-      policy::DeviceLocalAccountPolicyService* policy_service =
+      policy::DeviceLocalAccountPolicyBroker* broker =
           g_browser_process->platform_part()
               ->browser_policy_connector_ash()
-              ->GetDeviceLocalAccountPolicyService();
-      // `policy_service` can be nullptr, e.g. in unit tests.
-      if (policy_service) {
-        policy::DeviceLocalAccountPolicyBroker* broker =
-            policy_service->GetBrokerForUser(
-                user->GetAccountId().GetUserEmail());
-        if (broker) {
-          core = broker->core();
-          component_policy_service = broker->component_policy_service();
-        }
+              ->GetDeviceLocalAccountPolicyService()
+              ->GetBrokerForUser(user->GetAccountId().GetUserEmail());
+      if (broker) {
+        core = broker->core();
+        component_policy_service = broker->component_policy_service();
       }
       break;
     }
diff --git a/chrome/browser/ash/crosapi/browser_manager_unittest.cc b/chrome/browser/ash/crosapi/browser_manager_unittest.cc
index 28f1f68..3f522c5 100644
--- a/chrome/browser/ash/crosapi/browser_manager_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_manager_unittest.cc
@@ -23,7 +23,6 @@
 #include "components/component_updater/mock_component_updater_service.h"
 #include "components/session_manager/core/session_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
-#include "components/user_manager/user_manager.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -80,9 +79,8 @@
 
   void SimulateLacrosTermination() {
     SetStatePublic(State::TERMINATING);
-    if (browser_service_.has_value()) {
+    if (browser_service_.has_value())
       OnBrowserServiceDisconnected(*crosapi_id_, browser_service_->mojo_id);
-    }
     OnLacrosChromeTerminated();
   }
 
@@ -194,57 +192,15 @@
     crosapi::browser_util::ClearLacrosAvailabilityCacheForTest();
   }
 
-  enum class UserType {
-    kRegularUser = 0,
-    kWebKiosk = 1,
-    kChromeAppKiosk = 2,
-    kMaxValue = kChromeAppKiosk,
-  };
-
-  void AddUser(UserType user_type) {
-    const std::string email = "user@test.com";
+  void AddRegularUser(const std::string& email) {
     AccountId account_id = AccountId::FromUserEmail(email);
-
-    User* user;
-    switch (user_type) {
-      case UserType::kRegularUser:
-        user = fake_user_manager_->AddUser(account_id);
-        break;
-      case UserType::kWebKiosk:
-        user = fake_user_manager_->AddWebKioskAppUser(account_id);
-        break;
-      case UserType::kChromeAppKiosk:
-        user = fake_user_manager_->AddKioskAppUser(account_id);
-        break;
-    }
-
+    const User* user = fake_user_manager_->AddUser(account_id);
     fake_user_manager_->UserLoggedIn(account_id, user->username_hash(),
                                      /*browser_restart=*/false,
                                      /*is_child=*/false);
     fake_user_manager_->SimulateUserProfileLoad(account_id);
     ash::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
         user, &testing_profile_);
-
-    browser_util::SetProfileMigrationCompletedForUser(
-        local_state_.Get(),
-        ash::ProfileHelper::Get()
-            ->GetUserByProfile(&testing_profile_)
-            ->username_hash(),
-        browser_util::MigrationMode::kCopy);
-
-    EXPECT_TRUE(browser_util::IsLacrosEnabled());
-    EXPECT_TRUE(browser_util::IsLacrosAllowedToLaunch());
-  }
-
-  void ExpectCallingLoad(browser_util::LacrosSelection load_selection =
-                             browser_util::LacrosSelection::kRootfs,
-                         const std::string& lacros_path = "/run/lacros") {
-    EXPECT_CALL(*browser_loader_, Load(_))
-        .WillOnce([load_selection, &lacros_path](
-                      BrowserLoader::LoadCompletionCallback callback) {
-          std::move(callback).Run(base::FilePath(lacros_path), load_selection,
-                                  base::Version());
-        });
   }
 
  protected:
@@ -271,14 +227,27 @@
 };
 
 TEST_F(BrowserManagerTest, LacrosKeepAlive) {
-  AddUser(UserType::kRegularUser);
+  AddRegularUser("user@test.com");
+  browser_util::SetProfileMigrationCompletedForUser(
+      local_state_.Get(),
+      ash::ProfileHelper::Get()
+          ->GetUserByProfile(&testing_profile_)
+          ->username_hash(),
+      browser_util::MigrationMode::kCopy);
+  EXPECT_TRUE(browser_util::IsLacrosEnabled());
+  EXPECT_TRUE(browser_util::IsLacrosAllowedToLaunch());
 
   using State = BrowserManagerFake::State;
   EXPECT_EQ(fake_browser_manager_->start_count(), 0);
 
   // Attempt to mount the Lacros image. Will not start as it does not meet the
   // automatic start criteria.
-  ExpectCallingLoad();
+  EXPECT_CALL(*browser_loader_, Load(_))
+      .WillOnce([](BrowserLoader::LoadCompletionCallback callback) {
+        std::move(callback).Run(base::FilePath("/run/lacros"),
+                                browser_util::LacrosSelection::kRootfs,
+                                base::Version());
+      });
   fake_browser_manager_->InitializeAndStartIfNeeded();
   EXPECT_EQ(fake_browser_manager_->start_count(), 0);
 
@@ -305,8 +274,22 @@
 }
 
 TEST_F(BrowserManagerTest, LacrosKeepAliveReloadsWhenUpdateAvailable) {
-  AddUser(UserType::kRegularUser);
-  ExpectCallingLoad();
+  AddRegularUser("user@test.com");
+  browser_util::SetProfileMigrationCompletedForUser(
+      local_state_.Get(),
+      ash::ProfileHelper::Get()
+          ->GetUserByProfile(&testing_profile_)
+          ->username_hash(),
+      browser_util::MigrationMode::kCopy);
+  EXPECT_TRUE(browser_util::IsLacrosEnabled());
+  EXPECT_TRUE(browser_util::IsLacrosAllowedToLaunch());
+
+  EXPECT_CALL(*browser_loader_, Load(_))
+      .WillOnce([](BrowserLoader::LoadCompletionCallback callback) {
+        std::move(callback).Run(base::FilePath("/run/lacros"),
+                                browser_util::LacrosSelection::kRootfs,
+                                base::Version());
+      });
   fake_browser_manager_->InitializeAndStartIfNeeded();
 
   using State = BrowserManagerFake::State;
@@ -322,8 +305,12 @@
   std::unique_ptr<BrowserManager::ScopedKeepAlive> keep_alive =
       fake_browser_manager_->KeepAlive(BrowserManager::Feature::kTestOnly);
 
-  ExpectCallingLoad(browser_util::LacrosSelection::kStateful,
-                    kSampleLacrosPath);
+  EXPECT_CALL(*browser_loader_, Load(_))
+      .WillOnce([](BrowserLoader::LoadCompletionCallback callback) {
+        std::move(callback).Run(base::FilePath(kSampleLacrosPath),
+                                browser_util::LacrosSelection::kStateful,
+                                base::Version());
+      });
 
   // On simulated termination, KeepAlive restarts Lacros. Since there is an
   // update, it should first load the updated image.
@@ -333,8 +320,22 @@
 }
 
 TEST_F(BrowserManagerTest, NewWindowReloadsWhenUpdateAvailable) {
-  AddUser(UserType::kRegularUser);
-  ExpectCallingLoad();
+  AddRegularUser("user@test.com");
+  browser_util::SetProfileMigrationCompletedForUser(
+      local_state_.Get(),
+      ash::ProfileHelper::Get()
+          ->GetUserByProfile(&testing_profile_)
+          ->username_hash(),
+      browser_util::MigrationMode::kCopy);
+  EXPECT_TRUE(browser_util::IsLacrosEnabled());
+  EXPECT_TRUE(browser_util::IsLacrosAllowedToLaunch());
+
+  EXPECT_CALL(*browser_loader_, Load(_))
+      .WillOnce([](BrowserLoader::LoadCompletionCallback callback) {
+        std::move(callback).Run(base::FilePath("/run/lacros"),
+                                browser_util::LacrosSelection::kRootfs,
+                                base::Version());
+      });
   fake_browser_manager_->InitializeAndStartIfNeeded();
 
   // Set the state of the browser manager as stopped, which would match the
@@ -359,14 +360,28 @@
 
 TEST_F(BrowserManagerTest, LacrosKeepAliveDoesNotBlockRestart) {
   EXPECT_CALL(mock_browser_service_, UpdateKeepAlive(_)).Times(0);
-  AddUser(UserType::kRegularUser);
+
+  AddRegularUser("user@test.com");
+  browser_util::SetProfileMigrationCompletedForUser(
+      local_state_.Get(),
+      ash::ProfileHelper::Get()
+          ->GetUserByProfile(&testing_profile_)
+          ->username_hash(),
+      browser_util::MigrationMode::kCopy);
+  EXPECT_TRUE(browser_util::IsLacrosEnabled());
+  EXPECT_TRUE(browser_util::IsLacrosAllowedToLaunch());
 
   using State = BrowserManagerFake::State;
   EXPECT_EQ(fake_browser_manager_->start_count(), 0);
 
   // Attempt to mount the Lacros image. Will not start as it does not meet the
   // automatic start criteria.
-  ExpectCallingLoad();
+  EXPECT_CALL(*browser_loader_, Load(_))
+      .WillOnce([](BrowserLoader::LoadCompletionCallback callback) {
+        std::move(callback).Run(base::FilePath("/run/lacros"),
+                                browser_util::LacrosSelection::kRootfs,
+                                base::Version());
+      });
   fake_browser_manager_->InitializeAndStartIfNeeded();
   EXPECT_EQ(fake_browser_manager_->start_count(), 0);
 
@@ -416,28 +431,4 @@
   EXPECT_EQ(fake_browser_manager_->start_count(), 4);
 }
 
-// In the Kiosk session, the Lacros window is created during the kiosk launch,
-// no need to create a new window in this case.
-TEST_F(BrowserManagerTest, DoNotOpenNewLacrosWindowInChromeAppKiosk) {
-  AddUser(UserType::kChromeAppKiosk);
-  ExpectCallingLoad();
-
-  fake_browser_manager_->InitializeAndStartIfNeeded();
-
-  EXPECT_CALL(mock_browser_service_, NewWindow(_, _, _, _)).Times(0);
-
-  fake_browser_manager_->SimulateLacrosStart(&mock_browser_service_);
-}
-
-TEST_F(BrowserManagerTest, DoNotOpenNewLacrosWindowInWebKiosk) {
-  AddUser(UserType::kWebKiosk);
-  ExpectCallingLoad();
-
-  fake_browser_manager_->InitializeAndStartIfNeeded();
-
-  EXPECT_CALL(mock_browser_service_, NewWindow(_, _, _, _)).Times(0);
-
-  fake_browser_manager_->SimulateLacrosStart(&mock_browser_service_);
-}
-
 }  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/networking_private_ash.cc b/chrome/browser/ash/crosapi/networking_private_ash.cc
index 38d9d3c..dfd574c 100644
--- a/chrome/browser/ash/crosapi/networking_private_ash.cc
+++ b/chrome/browser/ash/crosapi/networking_private_ash.cc
@@ -277,7 +277,7 @@
                                          base::Value properties,
                                          CreateNetworkCallback callback) {
   auto [success, failure] = SplitStringAdapterCallback(std::move(callback));
-  GetDelegate()->CreateNetwork(shared, std::move(properties),
+  GetDelegate()->CreateNetwork(shared, std::move(properties).TakeDict(),
                                std::move(success), std::move(failure));
 }
 
diff --git a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
index dbbf99e..af484953 100644
--- a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
@@ -6436,6 +6436,7 @@
     result_per_sink_data.sink_type =
         CompositorFrameSinkTypeToString(per_sink_data->type);
     result_per_sink_data.is_root = per_sink_data->is_root;
+    result_per_sink_data.debug_label = per_sink_data->debug_label;
 
     if (per_sink_data->start_bucket != 0) {
       result_per_sink_data.presented_frames.resize(per_sink_data->start_bucket,
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.cc
index 42f63fa8..69fa30d 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.cc
@@ -4,21 +4,16 @@
 
 #include "chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h"
 
-#include "ash/constants/ash_features.h"
 #include "ash/constants/notifier_catalogs.h"
 #include "base/guid.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/notifications/notification_display_service.h"
-#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
-#include "chromeos/ash/components/proximity_auth/proximity_auth_pref_names.h"
 #include "chromeos/ash/components/proximity_auth/screenlock_bridge.h"
-#include "components/prefs/pref_service.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/chromeos/devicetype_utils.h"
@@ -37,9 +32,6 @@
 const char kEasyUnlockPairingChangeAppliedNotifierId[] =
     "easyunlock_notification_ids.pairing_change_applied";
 
-const char kSmartLockSignInRemovedNotifierId[] =
-    "easyunlock_notification_ids.sign_in_removed";
-
 // Convenience function for creating a Notification.
 std::unique_ptr<message_center::Notification> CreateNotification(
     const std::string& id,
@@ -66,40 +58,6 @@
 
 EasyUnlockNotificationController::~EasyUnlockNotificationController() {}
 
-// static
-bool EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-    Profile* profile) {
-  if (!profile->GetPrefs()->GetBoolean(
-          proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled))
-    return false;
-
-  if (!base::FeatureList::IsEnabled(features::kSmartLockSignInRemoved))
-    return false;
-
-  if (profile->GetPrefs()->GetBoolean(
-          prefs::kHasSeenSmartLockSignInRemovedNotification))
-    return false;
-
-  return true;
-}
-
-void EasyUnlockNotificationController::ShowSignInRemovedNotification() {
-  PrefService* pref_service = profile_->GetPrefs();
-  pref_service->SetBoolean(prefs::kHasSeenSmartLockSignInRemovedNotification,
-                           true);
-
-  ShowNotification(CreateNotification(
-      kSmartLockSignInRemovedNotifierId,
-      NotificationCatalogName::kEasyUnlockSmartLockSignInRemoved,
-      l10n_util::GetStringUTF16(
-          IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_TITLE),
-      l10n_util::GetStringUTF16(
-          IDS_SMART_LOCK_SIGN_IN_REMOVED_NOTIFICATION_MESSAGE),
-      ui::ImageModel(), {},
-      new NotificationDelegate(kSmartLockSignInRemovedNotifierId,
-                               weak_ptr_factory_.GetWeakPtr())));
-}
-
 void EasyUnlockNotificationController::ShowChromebookAddedNotification() {
   message_center::RichNotificationData rich_notification_data;
   rich_notification_data.buttons.push_back(
@@ -182,11 +140,6 @@
       /*metadata=*/nullptr);
 }
 
-void EasyUnlockNotificationController::LaunchEasyUnlockSettings() {
-  chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
-      profile_, chromeos::settings::mojom::kSmartLockSubpagePath);
-}
-
 void EasyUnlockNotificationController::LaunchMultiDeviceSettings() {
   chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
       profile_, chromeos::settings::mojom::kMultiDeviceFeaturesSubpagePath);
@@ -224,13 +177,7 @@
     DCHECK_EQ(1, *button_index);
   }
 
-  // The kSmartLockSignInRemoved flag removes the easy unlock settings page, so
-  // check flag to determine which route should be launched.
-  if (base::FeatureList::IsEnabled(features::kSmartLockSignInRemoved)) {
-    notification_controller_->LaunchMultiDeviceSettings();
-  } else {
-    notification_controller_->LaunchEasyUnlockSettings();
-  }
+  notification_controller_->LaunchMultiDeviceSettings();
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h
index 8ae743f..4d8cefa 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h
@@ -28,18 +28,6 @@
 
   virtual ~EasyUnlockNotificationController();
 
-  // TODO(b/227674947): Eventually remove this method after Sign in with Smart
-  // Lock has been removed and enough time has elapsed for users to be notified.
-  // Returns whether the kSignInRemovedNotification should be shown for the
-  // provided profile.
-  static bool ShouldShowSignInRemovedNotification(Profile* profile);
-
-  // TODO(b/227674947): Eventually remove this method after Sign in with Smart
-  // Lock has been removed and enough time has elapsed for users to be notified.
-  // Shows the notification explaining that Sign in with Smart Lock has been
-  // removed.
-  virtual void ShowSignInRemovedNotification();
-
   // Shows the notification when EasyUnlock is synced to a new Chromebook.
   virtual void ShowChromebookAddedNotification();
 
@@ -54,9 +42,6 @@
 
  protected:
   // Exposed for testing.
-  // TODO(b/227674947): Delete LaunchEasyUnlockSettings after Sign in with Smart
-  // Lock is removed.
-  virtual void LaunchEasyUnlockSettings();
   virtual void LaunchMultiDeviceSettings();
   virtual void LockScreen();
 
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller_unittest.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller_unittest.cc
index 6a12581..85549b1 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller_unittest.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "ash/constants/ash_features.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
@@ -35,7 +34,6 @@
   ~TestableNotificationController() override {}
 
   // EasyUnlockNotificationController:
-  MOCK_METHOD0(LaunchEasyUnlockSettings, void());
   MOCK_METHOD0(LaunchMultiDeviceSettings, void());
   MOCK_METHOD0(LockScreen, void());
 };
@@ -67,71 +65,6 @@
 };
 
 TEST_F(EasyUnlockNotificationControllerTest,
-       TestShouldShowSignInRemovedNotification) {
-  TestingProfile* test_profile = profile();
-  PrefService* pref_service = test_profile->GetPrefs();
-
-  ASSERT_FALSE(
-      EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          test_profile));
-
-  // Check returns false when kSmartLockSignInRemoved isn't enabled.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(features::kSmartLockSignInRemoved);
-  pref_service->SetBoolean(
-      proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled, true);
-  pref_service->SetBoolean(prefs::kHasSeenSmartLockSignInRemovedNotification,
-                           false);
-  ASSERT_FALSE(
-      EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          test_profile));
-
-  // Check returns false when kHasSeenSmartLockSignInRemovedNotification is
-  // true.
-  feature_list.Reset();
-  feature_list.InitAndEnableFeature(features::kSmartLockSignInRemoved);
-  pref_service->SetBoolean(prefs::kHasSeenSmartLockSignInRemovedNotification,
-                           true);
-  ASSERT_FALSE(
-      EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          test_profile));
-
-  // Check returns false when kProximityAuthIsChromeOSLoginEnabled is false.
-  pref_service->SetBoolean(
-      proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled, false);
-  pref_service->SetBoolean(prefs::kHasSeenSmartLockSignInRemovedNotification,
-                           false);
-  ASSERT_FALSE(
-      EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          test_profile));
-
-  pref_service->SetBoolean(
-      proximity_auth::prefs::kProximityAuthIsChromeOSLoginEnabled, true);
-  ASSERT_TRUE(
-      EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          test_profile));
-}
-
-TEST_F(EasyUnlockNotificationControllerTest,
-       TestShowSignInRemovedNotification) {
-  base::test::ScopedFeatureList feature_list(features::kSmartLockSignInRemoved);
-  const char kNotificationId[] = "easyunlock_notification_ids.sign_in_removed";
-
-  notification_controller_->ShowSignInRemovedNotification();
-  absl::optional<message_center::Notification> notification =
-      display_service_->GetNotification(kNotificationId);
-  ASSERT_TRUE(notification);
-
-  // Clicking notification button should launch settings.
-  EXPECT_CALL(*notification_controller_, LaunchMultiDeviceSettings());
-  notification->delegate()->Click(0, absl::nullopt);
-
-  // Clicking the notification itself should also launch settings.
-  EXPECT_CALL(*notification_controller_, LaunchMultiDeviceSettings());
-  notification->delegate()->Click(absl::nullopt, absl::nullopt);
-}
-
-TEST_F(EasyUnlockNotificationControllerTest,
        TestShowChromebookAddedNotification) {
   const char kNotificationId[] = "easyunlock_notification_ids.chromebook_added";
 
@@ -149,17 +82,6 @@
   // Clicking the notification itself should also launch settings.
   EXPECT_CALL(*notification_controller_, LaunchMultiDeviceSettings());
   notification->delegate()->Click(absl::nullopt, absl::nullopt);
-
-  // When kSmartLockSignInRemoved is disabled, LaunchEasyUnlockSettings() should
-  // be called instead.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(features::kSmartLockSignInRemoved);
-  EXPECT_CALL(*notification_controller_, LaunchEasyUnlockSettings());
-  notification->delegate()->Click(0, absl::nullopt);
-
-  // Clicking the notification itself should also launch settings.
-  EXPECT_CALL(*notification_controller_, LaunchEasyUnlockSettings());
-  notification->delegate()->Click(absl::nullopt, absl::nullopt);
 }
 
 TEST_F(EasyUnlockNotificationControllerTest,
@@ -183,13 +105,6 @@
   // Clicking 2nd notification button should launch settings.
   EXPECT_CALL(*notification_controller_, LaunchMultiDeviceSettings());
   notification->delegate()->Click(1, absl::nullopt);
-
-  // When kSmartLockSignInRemoved is disabled, LaunchEasyUnlockSettings() should
-  // be called instead.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(features::kSmartLockSignInRemoved);
-  EXPECT_CALL(*notification_controller_, LaunchEasyUnlockSettings());
-  notification->delegate()->Click(1, absl::nullopt);
 }
 
 TEST_F(EasyUnlockNotificationControllerTest,
@@ -214,18 +129,6 @@
   // Clicking the notification itself should also launch settings.
   EXPECT_CALL(*notification_controller_, LaunchMultiDeviceSettings());
   notification->delegate()->Click(absl::nullopt, absl::nullopt);
-
-  // When kSmartLockSignInRemoved is disabled, LaunchEasyUnlockSettings() should
-  // be called instead.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(features::kSmartLockSignInRemoved);
-  // Clicking notification button should launch settings.
-  EXPECT_CALL(*notification_controller_, LaunchEasyUnlockSettings());
-  notification->delegate()->Click(0, absl::nullopt);
-
-  // Clicking the notification itself should also launch settings.
-  EXPECT_CALL(*notification_controller_, LaunchEasyUnlockSettings());
-  notification->delegate()->Click(absl::nullopt, absl::nullopt);
 }
 
 TEST_F(EasyUnlockNotificationControllerTest,
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index 3fb3ce53..60a42c81 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -58,7 +58,6 @@
 #include "chrome/browser/ash/login/auth/chrome_safe_mode_delegate.h"
 #include "chrome/browser/ash/login/chrome_restart_request.h"
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
-#include "chrome/browser/ash/login/easy_unlock/easy_unlock_notification_controller.h"
 #include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h"
 #include "chrome/browser/ash/login/existing_user_controller.h"
 #include "chrome/browser/ash/login/helper.h"
@@ -2003,13 +2002,6 @@
       ->browser_policy_connector_ash()
       ->GetAdbSideloadingAllowanceModePolicyHandler()
       ->ShowAdbSideloadingPolicyChangeNotificationIfNeeded();
-
-  if (EasyUnlockNotificationController::ShouldShowSignInRemovedNotification(
-          profile)) {
-    easy_unlock_notification_controller_ =
-        std::make_unique<EasyUnlockNotificationController>(profile);
-    easy_unlock_notification_controller_->ShowSignInRemovedNotification();
-  }
 }
 
 void UserSessionManager::MaybeLaunchSettings(Profile* profile) {
@@ -2372,7 +2364,6 @@
   token_observers_.clear();
   always_on_vpn_manager_.reset();
   u2f_notification_.reset();
-  easy_unlock_notification_controller_.reset();
   help_app_notification_controller_.reset();
   password_service_voted_.reset();
   password_was_saved_ = false;
diff --git a/chrome/browser/ash/login/session/user_session_manager.h b/chrome/browser/ash/login/session/user_session_manager.h
index dbe195f8..c80aa203 100644
--- a/chrome/browser/ash/login/session/user_session_manager.h
+++ b/chrome/browser/ash/login/session/user_session_manager.h
@@ -57,7 +57,6 @@
 class OnboardingUserActivityCounter;
 class StubAuthenticatorBuilder;
 class TokenHandleFetcher;
-class EasyUnlockNotificationController;
 class EolNotification;
 class InputEventsBlocker;
 class U2FNotification;
@@ -626,11 +625,6 @@
   std::unique_ptr<HelpAppNotificationController>
       help_app_notification_controller_;
 
-  // TODO(b/227674947): Eventually delete this after Sign in with Smart Lock has
-  // been removed and enough time has elapsed for users to be notified.
-  std::unique_ptr<EasyUnlockNotificationController>
-      easy_unlock_notification_controller_;
-
   bool token_handle_backfill_tried_for_testing_ = false;
 
   std::unique_ptr<OnboardingUserActivityCounter>
diff --git a/chrome/browser/ash/net/network_portal_detector_impl.cc b/chrome/browser/ash/net/network_portal_detector_impl.cc
index aba7bf7..682388e 100644
--- a/chrome/browser/ash/net/network_portal_detector_impl.cc
+++ b/chrome/browser/ash/net/network_portal_detector_impl.cc
@@ -179,7 +179,7 @@
   }
 
   default_network_id_ = default_network->guid();
-  bool has_proxy = !default_network->proxy_config().is_none();
+  bool has_proxy = default_network->proxy_config().has_value();
   NET_LOG(EVENT) << "PortalStateChanged, id="
                  << NetworkGuidId(default_network_id_)
                  << " state=" << default_network->connection_state()
@@ -457,7 +457,7 @@
     SetNetworkPortalState(network, portal_state);
 
     base::UmaHistogramBoolean("Network.NetworkPortalDetectorHasProxy",
-                              !network->proxy_config().is_none());
+                              network->proxy_config().has_value());
   }
 
   ResetCountersAndSendMetrics();
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
index 62e5e05..459c455 100644
--- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
+++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
@@ -71,12 +71,15 @@
 // if it was a device wide user configured network. In particular this will
 // configure policy-set values as user configured as well.
 void ManagedOncConfigureActivePartAsDeviceWide(
-    base::Value network,
+    base::Value::Dict network,
     base::OnceCallback<void(bool)> callback) {
-  rollback_network_config::ManagedOncCollapseToActive(&network);
+  base::Value network_value(std::move(network));
+  rollback_network_config::ManagedOncCollapseToActive(&network_value);
+  DCHECK(network_value.is_dict());
+  network = std::move(network_value).TakeDict();
 
   const std::string& guid = rollback_network_config::GetStringValue(
-      network.GetDict(), onc::network_config::kGUID);
+      network, onc::network_config::kGUID);
   const NetworkState* network_state =
       network_state_handler()->GetNetworkStateFromGuid(guid);
 
@@ -84,17 +87,16 @@
   auto success_callback = base::BindOnce(std::move(callbacks.first), true);
   auto failure_callback = base::BindOnce(std::move(callbacks.second), false);
 
-  network.SetStringKey(onc::network_config::kSource,
-                       onc::network_config::kSourceDevice);
+  network.Set(onc::network_config::kSource, onc::network_config::kSourceDevice);
   if (!network_state || !network_state->IsInProfile()) {
     managed_network_configuration_handler()->CreateConfiguration(
-        kDeviceUserHash, network.GetDict(),
+        kDeviceUserHash, network,
         base::BindOnce([](const std::string&, const std::string&) {
         }).Then(std::move(success_callback)),
         base::BindOnce(&PrintError).Then(std::move(failure_callback)));
   } else if (network_state) {
     managed_network_configuration_handler()->SetProperties(
-        network_state->path(), network.GetDict(), std::move(success_callback),
+        network_state->path(), network, std::move(success_callback),
         base::BindOnce(&PrintError).Then(std::move(failure_callback)));
   }
 }
@@ -119,12 +121,12 @@
   return networks;
 }
 
-void ReconfigureUiData(const base::Value& network_config,
+void ReconfigureUiData(const base::Value::Dict& network_config,
                        const std::string& guid) {
   const NetworkState* network_state =
       network_state_handler()->GetNetworkStateFromGuid(guid);
 
-  base::Value ui_data = network_config.Clone();
+  base::Value ui_data(network_config.Clone());
   rollback_network_config::ManagedOncCollapseToUiData(&ui_data);
 
   managed_network_configuration_handler()->SetProperties(
@@ -338,7 +340,7 @@
 
   bool IsOwnershipTaken() const;
 
-  std::vector<base::Value> imported_networks_;
+  std::vector<base::Value::Dict> imported_networks_;
 
   bool all_networks_successfully_configured = true;
 
@@ -369,20 +371,22 @@
   absl::optional<base::Value> managed_onc_network_config =
       base::JSONReader::Read(network_config);
 
-  if (!managed_onc_network_config.has_value()) {
+  if (!managed_onc_network_config.has_value() ||
+      !managed_onc_network_config->is_dict()) {
     std::move(callback).Run(false);
     return;
   }
 
-  base::Value* network_list = managed_onc_network_config->FindListKey(
-      onc::toplevel_config::kNetworkConfigurations);
-  if (!network_list || !network_list->is_list()) {
+  base::Value::List* network_list =
+      managed_onc_network_config->GetDict().FindList(
+          onc::toplevel_config::kNetworkConfigurations);
+  if (!network_list) {
     std::move(callback).Run(false);
     return;
   }
 
   auto barrier_closure = base::BarrierClosure(
-      network_list->GetList().size(),
+      network_list->size(),
       base::BindOnce(&RollbackNetworkConfig::Importer::AllNetworksConfigured,
                      weak_factory_.GetWeakPtr(), std::move(callback)));
 
@@ -392,15 +396,20 @@
 
   bool ownership_taken = IsOwnershipTaken();
 
-  for (base::Value& network : network_list->GetList()) {
+  for (base::Value& network : *network_list) {
+    base::Value::Dict* network_dict = network.GetIfDict();
+    if (!network_dict) {
+      continue;
+    }
+
     if (!ownership_taken) {
-      ManagedOncConfigureActivePartAsDeviceWide(network.Clone(),
+      ManagedOncConfigureActivePartAsDeviceWide(network_dict->Clone(),
                                                 finished_a_network);
     }
     // If ownership is taken already we may still be waiting for policy
     // application to finish. Once it's finished, `PoliciesApplied`
     // reconfigures the networks.
-    imported_networks_.push_back(std::move(network));
+    imported_networks_.push_back(std::move(*network_dict));
   }
 }
 
@@ -432,14 +441,14 @@
     return;
   }
 
-  for (const base::Value& network_config : imported_networks_) {
+  for (const base::Value::Dict& network_config : imported_networks_) {
     const std::string& guid = rollback_network_config::GetStringValue(
-        network_config.GetDict(), onc::network_config::kGUID);
+        network_config, onc::network_config::kGUID);
     const NetworkState* network_state =
         network_state_handler()->GetNetworkStateFromGuid(guid);
 
-    if (network_state && rollback_network_config::OncIsSourceDevicePolicy(
-                             network_config.GetDict())) {
+    if (network_state &&
+        rollback_network_config::OncIsSourceDevicePolicy(network_config)) {
       if (network_state->IsManagedByPolicy()) {
         ReconfigureUiData(network_config, guid);
       } else {  // Policy did not reconfigure the network, delete it.
@@ -455,12 +464,11 @@
 }
 
 void RollbackNetworkConfig::Importer::DeleteImportedPolicyNetworks() {
-  for (const base::Value& network_config : imported_networks_) {
+  for (const base::Value::Dict& network_config : imported_networks_) {
     const std::string& guid = rollback_network_config::GetStringValue(
-        network_config.GetDict(), onc::network_config::kGUID);
+        network_config, onc::network_config::kGUID);
 
-    if (rollback_network_config::OncIsSourceDevicePolicy(
-            network_config.GetDict())) {
+    if (rollback_network_config::OncIsSourceDevicePolicy(network_config)) {
       const NetworkState* network_state =
           network_state_handler()->GetNetworkStateFromGuid(guid);
 
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc
index cb12b5a..ebbe41b 100644
--- a/chrome/browser/ash/preferences.cc
+++ b/chrome/browser/ash/preferences.cc
@@ -413,11 +413,6 @@
 
   registry->RegisterBooleanPref(::prefs::kLanguageImeMenuActivated, false);
 
-  // TODO(b/227674947): Eventually delete this after Sign in with Smart Lock has
-  // been removed and enough time has elapsed for users to be notified.
-  registry->RegisterBooleanPref(
-      ::prefs::kHasSeenSmartLockSignInRemovedNotification, false);
-
   registry->RegisterInt64Pref(::prefs::kHatsLastInteractionTimestamp, 0);
 
   registry->RegisterInt64Pref(::prefs::kHatsSurveyCycleEndTimestamp, 0);
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
index 138e5b2b..f4ae55c 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
@@ -285,10 +285,21 @@
   // albums' previews. If |settings_->topic_source| is Google photos, refetch
   // the previews because the selected albums may have changed. Otherwise, we
   // fallback to the preview urls that comes with the albums.
-  OnGooglePhotosAlbumsPreviewsFetched(std::vector<GURL>());
+  OnPreviewsFetched(std::vector<GURL>());
   if (settings_->topic_source == ash::AmbientModeTopicSource::kGooglePhotos)
     FetchGooglePhotosAlbumsPreviews(settings_->selected_album_ids);
 
+  if (features::IsPersonalizationJellyEnabled() &&
+      settings_->topic_source == ash::AmbientModeTopicSource::kArtGallery) {
+    if (is_updating_backend_) {
+      // Once settings updated, fetch preview images.
+      needs_update_previews_ = true;
+    } else {
+      // Fetch preview images if settings have been updated.
+      FetchArtGalleryPreviews();
+    }
+  }
+
   ambient_observer_remote_->OnTopicSourceChanged(settings_->topic_source);
 }
 
@@ -385,6 +396,9 @@
   if (success) {
     update_settings_retry_backoff_.Reset();
     cached_settings_ = settings_sent_for_update_;
+    if (needs_update_previews_) {
+      FetchArtGalleryPreviews();
+    }
   } else {
     update_settings_retry_backoff_.InformOfRequest(/*succeeded=*/false);
   }
@@ -518,6 +532,14 @@
   OnTopicSourceChanged();
 }
 
+void PersonalizationAppAmbientProviderImpl::FetchArtGalleryPreviews() {
+  needs_update_previews_ = false;
+  previews_weak_factory_.InvalidateWeakPtrs();
+  ash::AmbientBackendController::Get()->FetchPreviewImages(
+      base::BindOnce(&PersonalizationAppAmbientProviderImpl::OnPreviewsFetched,
+                     previews_weak_factory_.GetWeakPtr()));
+}
+
 void PersonalizationAppAmbientProviderImpl::FetchGooglePhotosAlbumsPreviews(
     const std::vector<std::string>& album_ids) {
   const int num_previews = features::IsPersonalizationJellyEnabled() ? 3 : 4;
@@ -526,18 +548,17 @@
   const int preview_height =
       features::IsPersonalizationJellyEnabled() ? 130 : kBannerHeightPx;
   DCHECK(!album_ids.empty());
-  google_photos_albums_previews_weak_factory_.InvalidateWeakPtrs();
+  previews_weak_factory_.InvalidateWeakPtrs();
   ash::AmbientBackendController::Get()->GetGooglePhotosAlbumsPreview(
       album_ids, preview_width, preview_height, num_previews,
-      base::BindOnce(&PersonalizationAppAmbientProviderImpl::
-                         OnGooglePhotosAlbumsPreviewsFetched,
-                     google_photos_albums_previews_weak_factory_.GetWeakPtr()));
+      base::BindOnce(&PersonalizationAppAmbientProviderImpl::OnPreviewsFetched,
+                     previews_weak_factory_.GetWeakPtr()));
 }
 
-void PersonalizationAppAmbientProviderImpl::OnGooglePhotosAlbumsPreviewsFetched(
+void PersonalizationAppAmbientProviderImpl::OnPreviewsFetched(
     const std::vector<GURL>& preview_urls) {
   DVLOG(4) << __func__ << " preview_urls_size=" << preview_urls.size();
-  ambient_observer_remote_->OnGooglePhotosAlbumsPreviewsFetched(preview_urls);
+  ambient_observer_remote_->OnPreviewsFetched(preview_urls);
 }
 
 ash::PersonalAlbum*
@@ -566,7 +587,7 @@
 void PersonalizationAppAmbientProviderImpl::ResetLocalSettings() {
   write_weak_factory_.InvalidateWeakPtrs();
   read_weak_factory_.InvalidateWeakPtrs();
-  google_photos_albums_previews_weak_factory_.InvalidateWeakPtrs();
+  previews_weak_factory_.InvalidateWeakPtrs();
 
   settings_.reset();
   cached_settings_.reset();
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
index 620cd7e..40793a3 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
@@ -104,10 +104,10 @@
   // Update topic source if needed.
   void MaybeUpdateTopicSource(ash::AmbientModeTopicSource topic_source);
 
+  void FetchArtGalleryPreviews();
   void FetchGooglePhotosAlbumsPreviews(
       const std::vector<std::string>& album_ids);
-  void OnGooglePhotosAlbumsPreviewsFetched(
-      const std::vector<GURL>& preview_urls);
+  void OnPreviewsFetched(const std::vector<GURL>& preview_urls);
 
   ash::PersonalAlbum* FindPersonalAlbumById(const std::string& album_id);
 
@@ -156,6 +156,9 @@
   // Whether there are pending updates.
   bool has_pending_updates_for_backend_ = false;
 
+  // Whether to update previews when `UpdateSettings()` returns successfully.
+  bool needs_update_previews_ = false;
+
   // A flag to record if the user has seen the ambient mode page.
   bool page_viewed_ = false;
 
@@ -167,7 +170,7 @@
   base::WeakPtrFactory<PersonalizationAppAmbientProviderImpl>
       read_weak_factory_{this};
   base::WeakPtrFactory<PersonalizationAppAmbientProviderImpl>
-      google_photos_albums_previews_weak_factory_{this};
+      previews_weak_factory_{this};
 };
 
 }  // namespace ash::personalization_app
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
index 6f7aad8..8dd24c3 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
@@ -64,8 +64,7 @@
     temperature_unit_ = temperature_unit;
   }
 
-  void OnGooglePhotosAlbumsPreviewsFetched(
-      const std::vector<GURL>& previews) override {
+  void OnPreviewsFetched(const std::vector<GURL>& previews) override {
     previews_ = std::move(previews);
   }
 
diff --git a/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc b/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc
index 73e060a..2006660 100644
--- a/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc
+++ b/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc
@@ -24,8 +24,6 @@
   version_info::Channel channel = chrome::GetChannel();
   source->AddBoolean("isDevChannel", channel == version_info::Channel::DEV);
   source->AddBoolean("isDebugMode", ash::features::IsProjectorAppDebugMode());
-  source->AddBoolean("isExcludeTranscriptEnabled",
-                     ash::features::IsProjectorExcludeTranscriptEnabled());
   source->AddBoolean("isTutorialVideoViewEnabled",
                      ash::features::IsProjectorTutorialVideoViewEnabled());
   source->AddBoolean("isCustomThumbnailEnabled",
diff --git a/chrome/browser/autofill/content_autofill_driver_browsertest.cc b/chrome/browser/autofill/content_autofill_driver_browsertest.cc
index be5d7ae..203db76 100644
--- a/chrome/browser/autofill/content_autofill_driver_browsertest.cc
+++ b/chrome/browser/autofill/content_autofill_driver_browsertest.cc
@@ -15,10 +15,11 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/content/browser/test_content_autofill_client.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
-#include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
@@ -43,9 +44,9 @@
 namespace autofill {
 namespace {
 
-class MockAutofillClient : public TestAutofillClient {
+class MockAutofillClient : public TestContentAutofillClient {
  public:
-  MockAutofillClient() = default;
+  using TestContentAutofillClient::TestContentAutofillClient;
 
   MockAutofillClient(const MockAutofillClient&) = delete;
   MockAutofillClient& operator=(const MockAutofillClient&) = delete;
@@ -89,26 +90,23 @@
   }
 
   void SetUpOnMainThread() override {
-    autofill_client_ =
-        std::make_unique<testing::NiceMock<MockAutofillClient>>();
     content::WebContents* web_contents =
         browser()->tab_strip_model()->GetActiveWebContents();
     ASSERT_TRUE(web_contents != nullptr);
-    Observe(web_contents);
-    prefs::RegisterProfilePrefs(autofill_client().GetPrefRegistry());
 
-    web_contents->RemoveUserData(
-        ContentAutofillDriverFactory::
-            kContentAutofillDriverFactoryWebContentsUserDataKey);
-    ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-        web_contents, &autofill_client(),
-        base::BindRepeating(&autofill::BrowserDriverInitHook,
-                            &autofill_client(), "en-US"));
+    auto autofill_client =
+        std::make_unique<testing::NiceMock<MockAutofillClient>>(web_contents);
+    autofill_client_ = autofill_client.get();
+    web_contents->SetUserData(autofill_client_->UserDataKey(),
+                              std::move(autofill_client));
 
     password_manager::ContentPasswordManagerDriverFactoryTestApi(
         password_manager::ContentPasswordManagerDriverFactory::FromWebContents(
             web_contents))
-        .SetAutofillClient(autofill_client_.get());
+        .SetAutofillClient(autofill_client_);
+
+    Observe(web_contents);
+    prefs::RegisterProfilePrefs(autofill_client_->GetPrefRegistry());
 
     // Serve both a.com and b.com (and any other domain).
     host_resolver()->AddRule("*", "127.0.0.1");
@@ -117,8 +115,9 @@
 
   void TearDownOnMainThread() override {
     // Verify the expectations here, because closing the browser may incur
-    // other calls in |autofill_client()| e.g., HideAutofillPopup.
-    testing::Mock::VerifyAndClearExpectations(&autofill_client());
+    // other calls in `autofill_client_` e.g., HideAutofillPopup().
+    testing::Mock::VerifyAndClearExpectations(autofill_client_);
+    web_contents()->RemoveUserData(autofill_client_->UserDataKey());
   }
 
   void OnVisibilityChanged(content::Visibility visibility) override {
@@ -146,10 +145,6 @@
     }
   }
 
-  testing::NiceMock<MockAutofillClient>& autofill_client() {
-    return *autofill_client_.get();
-  }
-
   content::test::PrerenderTestHelper& prerender_helper() {
     return prerender_helper_;
   }
@@ -158,19 +153,23 @@
     return browser()->tab_strip_model()->GetActiveWebContents();
   }
 
+  ContentAutofillDriverFactory* autofill_driver_factory() {
+    return autofill_client_->GetAutofillDriverFactory();
+  }
+
  protected:
   base::OnceClosure web_contents_hidden_callback_;
   base::OnceClosure nav_entry_committed_callback_;
   base::OnceClosure same_document_navigation_callback_;
   base::OnceClosure subframe_navigation_callback_;
 
-  std::unique_ptr<testing::NiceMock<MockAutofillClient>> autofill_client_;
+  raw_ptr<testing::NiceMock<MockAutofillClient>> autofill_client_;
   content::test::PrerenderTestHelper prerender_helper_;
 };
 
 IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,
                        SwitchTabAndHideAutofillPopup) {
-  EXPECT_CALL(autofill_client(),
+  EXPECT_CALL(*autofill_client_,
               HideAutofillPopup(PopupHidingReason::kTabGone));
 
   scoped_refptr<content::MessageLoopRunner> runner =
@@ -190,7 +189,7 @@
   // The Autofill popup should be hidden for same document navigations. It may
   // called twice because the zoom changed event may also fire for same-page
   // navigations.
-  EXPECT_CALL(autofill_client(),
+  EXPECT_CALL(*autofill_client_,
               HideAutofillPopup(PopupHidingReason::kNavigation))
       .Times(testing::AtLeast(1));
 
@@ -214,13 +213,13 @@
   int host_id = content::RenderFrameHost::kNoFrameTreeNodeId;
 
   {
-    EXPECT_CALL(autofill_client(),
+    EXPECT_CALL(*autofill_client_,
                 HideAutofillPopup(PopupHidingReason::kNavigation))
         .Times(0);
     host_id = prerender_helper().AddPrerender(prerender_url);
   }
 
-  EXPECT_CALL(autofill_client(),
+  EXPECT_CALL(*autofill_client_,
               HideAutofillPopup(PopupHidingReason::kNavigation))
       .Times(testing::AtLeast(1));
 
@@ -237,7 +236,7 @@
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
 
   // The Autofill popup should NOT be hidden for subframe navigations.
-  EXPECT_CALL(autofill_client(), HideAutofillPopup).Times(0);
+  EXPECT_CALL(*autofill_client_, HideAutofillPopup).Times(0);
 
   scoped_refptr<content::MessageLoopRunner> runner =
       new content::MessageLoopRunner;
@@ -254,7 +253,7 @@
 IN_PROC_BROWSER_TEST_F(ContentAutofillDriverBrowserTest,
                        TestPageNavigationHidingAutofillPopup) {
   // HideAutofillPopup is called once for each navigation.
-  EXPECT_CALL(autofill_client(),
+  EXPECT_CALL(*autofill_client_,
               HideAutofillPopup(PopupHidingReason::kNavigation))
       .Times(2);
 
@@ -291,7 +290,7 @@
 
   // Set a dummy form data to simulate to submit a form. And, OnFormSubmitted
   // method will be called upon navigation.
-  ContentAutofillDriverFactory::FromWebContents(web_contents())
+  autofill_driver_factory()
       ->DriverForFrame(web_contents()->GetPrimaryMainFrame())
       ->renderer_events()
       .SetFormToBeProbablySubmitted(absl::make_optional<FormData>());
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index fb935917..dbd49bf 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -29,11 +29,6 @@
         <include name="IDR_ABOUT_NACL_CSS" file="resources\about_nacl\about_nacl.css" type="chrome_html" />
         <include name="IDR_ABOUT_NACL_JS" file="${root_gen_dir}\chrome\browser\resources\about_nacl\tsc\about_nacl.js" use_base_dir="false" type="BINDATA" />
       </if>
-      <if expr="not is_android">
-        <include name="IDR_ABOUT_SYS_HTML" file="resources\about_sys\about_sys.html" type="BINDATA" />
-        <include name="IDR_ABOUT_SYS_CSS" file="resources\about_sys\about_sys.css" type="BINDATA" />
-        <include name="IDR_ABOUT_SYS_JS" file="resources\about_sys\about_sys.js" preprocess="true" type="BINDATA" />
-      </if>
       <include name="IDR_AD_NETWORK_HASHES" file="resources\ad_networks.dat" type="BINDATA" />
       <if expr="enable_webui_certificate_viewer">
         <include name="IDR_CERTIFICATE_VIEWER_HTML" file="resources\certificate_viewer\certificate_viewer.html" type="BINDATA" />
@@ -42,64 +37,9 @@
       </if>
       <if expr="chromeos_ash">
         <include name="IDR_CHROME_APP_MANIFEST" file="resources\chrome_app\manifest.json" type="BINDATA" />
-      </if>
-      <if expr="is_android">
-        <include name="IDR_DEV_UI_LOADER_ERROR_HTML" file="resources/dev_ui/dev_ui_loader_error.html" type="BINDATA" />
-        <include name="IDR_OFFLINE_INTERNALS_HTML" file="resources\offline_pages\offline_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
-        <include name="IDR_OFFLINE_INTERNALS_CSS" file="resources\offline_pages\offline_internals.css" type="BINDATA" />
-        <include name="IDR_OFFLINE_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals.js" use_base_dir="false" type="BINDATA" />
-        <include name="IDR_OFFLINE_INTERNALS_BROWSER_PROXY_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals_browser_proxy.js" use_base_dir="false" type="BINDATA" />
-        <include name="IDR_VIDEO_PLAYER_HTML" file="resources\video_tutorials\video_player.html" type="BINDATA" />
-        <include name="IDR_VIDEO_PLAYER_CSS" file="resources\video_tutorials\video_player.css" type="BINDATA" />
-        <include name="IDR_VIDEO_PLAYER_JS" file="${root_gen_dir}\chrome\browser\resources\video_tutorials\tsc\video_player.js" use_base_dir="false" type="BINDATA" />
-      </if>
-
-      <if expr="enable_hangout_services_extension">
-        <!-- Hangout Services extension, included in Google Chrome builds only. -->
-        <include name="IDR_HANGOUT_SERVICES_MANIFEST" file="resources\hangout_services\manifest.json" type="BINDATA" />
-      </if>
-
-      <!-- Contact Center Insights extension, enabled on managed ChromeOS devices -->
-      <if expr="is_chromeos">
-        <include name="IDR_CONTACT_CENTER_INSIGHTS_MANIFEST" file="resources\chromeos\contact_center_insights\manifest.json" type="BINDATA" />
-      </if>
-
-      <!-- Desk API extension, enabled on managed ChromeOS devices -->
-      <if expr="chromeos_ash or chromeos_lacros">
-        <include name="IDR_DESK_API_MANIFEST" file="resources\chromeos\desk_api\manifest.json" type="BINDATA" />
-      </if>
-
-      <if expr="not is_android">
-        <!-- Page not available for guest. -->
-        <include name="IDR_PAGE_NOT_AVAILABLE_FOR_GUEST_APP_HTML" file="resources\page_not_available_for_guest\app.html" type="BINDATA" />
-      </if>
-
-      <if expr="is_chromeos">
-        <include name="IDR_CHROME_URLS_DISABLED_PAGE_HTML" file="resources\chromeos\chrome_urls_disabled_page\app.html" type="BINDATA" />
-      </if>
-
-      <include name="IDR_IDENTITY_API_SCOPE_APPROVAL_MANIFEST" file="resources\identity_scope_approval_dialog\manifest.json" type="BINDATA" />
-
-      <include name="IDR_INSPECT_CSS" file="resources\inspect\inspect.css" flattenhtml="true" type="BINDATA" />
-      <include name="IDR_INSPECT_HTML" file="resources\inspect\inspect.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
-      <include name="IDR_INSPECT_JS" file="resources\inspect\inspect.js" type="BINDATA" />
-
-      <include name="IDR_NETWORK_SPEECH_SYNTHESIS_MANIFEST" file="resources\network_speech_synthesis\manifest.json" type="BINDATA" />
-
-      <if expr="chromeos_ash">
         <include name="IDR_ORIGIN_MOJO_JS" file="${root_gen_dir}\url\mojom\origin.mojom-lite.js" use_base_dir="false" type="BINDATA"/>
-      </if>
-      <if expr="enable_pdf">
-        <include name="IDR_PDF_MANIFEST" file="resources\pdf\manifest.json" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <include name="IDR_URL_MOJOM_LITE_JS" file="${root_gen_dir}\url\mojom\url.mojom-lite.js" use_base_dir="false" type="BINDATA" />
-      </if>
-      <include name="IDR_WEBSTORE_MANIFEST" file="resources\webstore_app\manifest.json" type="BINDATA" />
-      <if expr="is_chromeos">
-        <include name="IDR_ECHO_MANIFEST" file="resources\chromeos\echo\manifest.json" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
+
         <!-- Shared images for ChromeOS WebUIs -->
         <include name="IDR_CHROME_OS_AN_ERROR_OCCURRED_SVG" file="resources\chromeos\images\an_error_occurred.svg" type="BINDATA" />
         <include name="IDR_CHROME_OS_NO_NETWORK_SVG" file="resources\chromeos\images\no_network.svg" type="BINDATA" />
@@ -179,24 +119,11 @@
         <include name="IDR_VM_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\vm\app.js" type="BINDATA" use_base_dir="false" />
         <include name="IDR_VM_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ui\webui\ash\vm\vm.mojom-webui.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_GUEST_OS_DIAGNOSTICS_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ash\guest_os\guest_os_diagnostics.mojom-webui.js" use_base_dir="false" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash and _google_chrome">
-        <include name="IDR_HELP_MANIFEST" file="resources\help_app\manifest.json" type="BINDATA" />
-        <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS" file="internal\resources\chromeos-sync-consent-icons.html" type="BINDATA" />
-        <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS_M_JS" file="internal\resources\chromeos-sync-consent-icons.m.js" type="BINDATA" />
-      </if>
-      <if expr="is_chromeos">
-        <if expr="_google_chrome">
-          <include name="IDR_QUICKOFFICE_MANIFEST" file="resources\chromeos\quickoffice\manifest.json" type="BINDATA" />
-        </if>
-      </if>
-      <if expr="_google_chrome">
-        <include name="IDR_PREF_HASH_SEED_BIN" file="resources\settings_internal\pref_hash_seed.bin" type="BINDATA" />
-        <include name="IDR_ADDITIONAL_MODULE_IDS" file="${additional_modules_list_file}" use_base_dir="false" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <if expr="_google_chrome">
           <then>
+            <include name="IDR_HELP_MANIFEST" file="resources\help_app\manifest.json" type="BINDATA" />
+            <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS" file="internal\resources\chromeos-sync-consent-icons.html" type="BINDATA" />
+            <include name="IDR_PRODUCT_CHROMEOS_SYNC_CONSENT_SCREEN_ICONS_M_JS" file="internal\resources\chromeos-sync-consent-icons.m.js" type="BINDATA" />
             <include name="IDR_SOUND_STARTUP_WAV" file="internal\resources\chromeos\sounds\startup.wav" type="BINDATA" />
           </then>
           <else>
@@ -221,8 +148,6 @@
         <include name="IDR_SOUND_CHARGE_MEDIUM_BATTERY_FLAC" file="resources\chromeos\sounds\power\charging_started_medium.flac" type="BINDATA" />
         <include name="IDR_SOUND_CHARGE_LOW_BATTERY_FLAC" file="resources\chromeos\sounds\power\charging_started_low.flac" type="BINDATA" />
         <include name="IDR_SOUND_NO_CHARGE_LOW_BATTERY_FLAC" file="resources\chromeos\sounds\power\low_battery.flac" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <include name="IDR_ABOUT_POWER_HTML" file="resources\chromeos\power.html" type="BINDATA" />
         <include name="IDR_ABOUT_POWER_JS" file="resources\chromeos\power.js" type="BINDATA" />
         <include name="IDR_ABOUT_POWER_CSS" file="resources\chromeos\power.css" type="BINDATA" />
@@ -235,14 +160,10 @@
         <include name="IDR_DEVICE_EMULATOR_INPUT_DEVICE_SETTINGS_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\emulator\input_device_settings.js" use_base_dir="false"  type="BINDATA" />
         <include name="IDR_DEVICE_EMULATOR_PAGES_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\emulator\device_emulator_pages.js" use_base_dir="false"  type="BINDATA" />
         <include name="IDR_DEVICE_EMULATOR_SHARED_STYLES_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\emulator\shared_styles.js" use_base_dir="false"  type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <include name="IDR_SET_TIME_HTML" file="resources\chromeos\set_time_dialog\set_time.html" type="BINDATA" />
         <include name="IDR_SET_TIME_DIALOG_HTML_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\set_time_dialog\set_time_dialog.html.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_SET_TIME_DIALOG_JS" file="resources\chromeos\set_time_dialog\set_time_dialog.js" type="BINDATA" />
         <include name="IDR_SET_TIME_BROWSER_PROXY_JS" file="resources\chromeos\set_time_dialog\set_time_browser_proxy.js" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <if expr="_google_chrome">
           <then>
             <include name="IDR_GOOGLE_XKB_MANIFEST" file="resources\chromeos\input_method\google_xkb_manifest.json" type="BINDATA" />
@@ -258,18 +179,7 @@
           </else>
         </if>
         <include name="IDR_BRAILLE_MANIFEST" file="resources\chromeos\accessibility\braille_ime_manifest.json" type="BINDATA" />
-      </if>
-      <if expr="not is_android">
-        <include name="IDR_MEDIA_ROUTER_INTERNALS_HTML" file="resources\media_router\internals\media_router_internals.html" type="BINDATA" />
-        <include name="IDR_MEDIA_ROUTER_INTERNALS_CSS" file="resources\media_router\internals\media_router_internals.css" type="BINDATA" />
-        <include name="IDR_MEDIA_ROUTER_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\media_router\internals\tsc\media_router_internals.js" use_base_dir="false" type="BINDATA" />
-      </if>
-      <if expr="not is_android">
-        <include name="IDR_IME_WINDOW_CLOSE" file="resources\input_ime\ime_window_close.png" type="BINDATA" />
-        <include name="IDR_IME_WINDOW_CLOSE_C" file="resources\input_ime\ime_window_close_click.png" type="BINDATA" />
-        <include name="IDR_IME_WINDOW_CLOSE_H" file="resources\input_ime\ime_window_close_hover.png" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
+
         <include name="IDR_SMB_SHARES_DIALOG_CONTAINER_HTML" file="resources\chromeos\smb_shares\smb_share_dialog_container.html" type="chrome_html" />
         <include name="IDR_SMB_SHARES_DIALOG_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\smb_shares\smb_share_dialog.js" use_base_dir="false" type="chrome_html" />
         <include name="IDR_SMB_CREDENTIALS_DIALOG_CONTAINER_HTML" file="resources\chromeos\smb_shares\smb_credentials_dialog_container.html" type="chrome_html" />
@@ -313,16 +223,7 @@
         <include name="IDR_PARENT_ACCESS_UI_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ui\webui\ash\parent_access\parent_access_ui.mojom-webui.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_PARENT_ACCESS_REQUEST_APPROVAL_SVG" file="resources\chromeos\parent_access\images\request_approval.svg" type="BINDATA" />
         <include name="IDR_PARENT_ACCESS_REQUEST_APPROVAL_DARK_SVG" file="resources\chromeos\parent_access\images\request_approval_dark.svg" type="BINDATA" />
-      </if>
-      <if expr="safe_browsing_mode == 1">
-        <include name="IDR_RESET_PASSWORD_HTML" file="resources\reset_password\reset_password.html" type="BINDATA" />
-        <include name="IDR_RESET_PASSWORD_JS" file="${root_gen_dir}\chrome\browser\resources\reset_password\tsc\reset_password.js" use_base_dir="false" type="BINDATA" />
-        <include name="IDR_RESET_PASSWORD_MOJOM_WEBUI_JS" file="${root_gen_dir}\chrome\browser\resources\reset_password\tsc\reset_password.mojom-webui.js" use_base_dir="false" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <include name="IDR_SMART_DIM_20190521_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="ash\power\ml\smart_dim\20190521_example_preprocessor_config.pb" type="BINDATA" />
-      </if>
-      <if expr="chromeos_ash">
         <include name="IDR_ARC_GRAPHICS_TRACING_HTML" file="resources\chromeos\arc_graphics_tracing\arc_graphics_tracing.html" type="BINDATA"/>
         <include name="IDR_ARC_GRAPHICS_TRACING_JS" file="resources\chromeos\arc_graphics_tracing\arc_graphics_tracing.js" type="BINDATA" />
         <include name="IDR_ARC_GRAPHICS_TRACING_UI_JS" file="resources\chromeos\arc_graphics_tracing\arc_graphics_tracing_ui.js" type="BINDATA" />
@@ -335,7 +236,71 @@
         <include name="IDR_ARC_POWER_CONTROL_JS" file="resources\chromeos\arc_power_control\arc_power_control.js" type="BINDATA" />
         <include name="IDR_ARC_POWER_CONTROL_CSS" file="resources\chromeos\arc_power_control\arc_power_control.css" type="BINDATA" />
       </if>
+      <if expr="safe_browsing_mode == 1">
+        <include name="IDR_RESET_PASSWORD_HTML" file="resources\reset_password\reset_password.html" type="BINDATA" />
+        <include name="IDR_RESET_PASSWORD_JS" file="${root_gen_dir}\chrome\browser\resources\reset_password\tsc\reset_password.js" use_base_dir="false" type="BINDATA" />
+        <include name="IDR_RESET_PASSWORD_MOJOM_WEBUI_JS" file="${root_gen_dir}\chrome\browser\resources\reset_password\tsc\reset_password.mojom-webui.js" use_base_dir="false" type="BINDATA" />
+      </if>
+      <if expr="is_android">
+        <include name="IDR_DEV_UI_LOADER_ERROR_HTML" file="resources/dev_ui/dev_ui_loader_error.html" type="BINDATA" />
+        <include name="IDR_OFFLINE_INTERNALS_HTML" file="resources\offline_pages\offline_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+        <include name="IDR_OFFLINE_INTERNALS_CSS" file="resources\offline_pages\offline_internals.css" type="BINDATA" />
+        <include name="IDR_OFFLINE_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals.js" use_base_dir="false" type="BINDATA" />
+        <include name="IDR_OFFLINE_INTERNALS_BROWSER_PROXY_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals_browser_proxy.js" use_base_dir="false" type="BINDATA" />
+        <include name="IDR_VIDEO_PLAYER_HTML" file="resources\video_tutorials\video_player.html" type="BINDATA" />
+        <include name="IDR_VIDEO_PLAYER_CSS" file="resources\video_tutorials\video_player.css" type="BINDATA" />
+        <include name="IDR_VIDEO_PLAYER_JS" file="${root_gen_dir}\chrome\browser\resources\video_tutorials\tsc\video_player.js" use_base_dir="false" type="BINDATA" />
+      </if>
+
+      <if expr="enable_hangout_services_extension">
+        <!-- Hangout Services extension, included in Google Chrome builds only. -->
+        <include name="IDR_HANGOUT_SERVICES_MANIFEST" file="resources\hangout_services\manifest.json" type="BINDATA" />
+      </if>
+
+      <!-- Desk API extension, enabled on managed ChromeOS devices -->
+      <if expr="chromeos_ash or chromeos_lacros">
+        <include name="IDR_DESK_API_MANIFEST" file="resources\chromeos\desk_api\manifest.json" type="BINDATA" />
+      </if>
+
+      <include name="IDR_IDENTITY_API_SCOPE_APPROVAL_MANIFEST" file="resources\identity_scope_approval_dialog\manifest.json" type="BINDATA" />
+
+      <include name="IDR_INSPECT_CSS" file="resources\inspect\inspect.css" flattenhtml="true" type="BINDATA" />
+      <include name="IDR_INSPECT_HTML" file="resources\inspect\inspect.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+      <include name="IDR_INSPECT_JS" file="resources\inspect\inspect.js" type="BINDATA" />
+
+      <include name="IDR_NETWORK_SPEECH_SYNTHESIS_MANIFEST" file="resources\network_speech_synthesis\manifest.json" type="BINDATA" />
+
+      <if expr="enable_pdf">
+        <include name="IDR_PDF_MANIFEST" file="resources\pdf\manifest.json" type="BINDATA" />
+      </if>
+      <include name="IDR_WEBSTORE_MANIFEST" file="resources\webstore_app\manifest.json" type="BINDATA" />
+      <if expr="is_chromeos">
+        <!-- Contact Center Insights extension, enabled on managed ChromeOS devices -->
+        <include name="IDR_CONTACT_CENTER_INSIGHTS_MANIFEST" file="resources\chromeos\contact_center_insights\manifest.json" type="BINDATA" />
+
+        <include name="IDR_CHROME_URLS_DISABLED_PAGE_HTML" file="resources\chromeos\chrome_urls_disabled_page\app.html" type="BINDATA" />
+        <include name="IDR_ECHO_MANIFEST" file="resources\chromeos\echo\manifest.json" type="BINDATA" />
+        <if expr="_google_chrome">
+          <include name="IDR_QUICKOFFICE_MANIFEST" file="resources\chromeos\quickoffice\manifest.json" type="BINDATA" />
+        </if>
+      </if>
+      <if expr="_google_chrome">
+        <include name="IDR_PREF_HASH_SEED_BIN" file="resources\settings_internal\pref_hash_seed.bin" type="BINDATA" />
+        <include name="IDR_ADDITIONAL_MODULE_IDS" file="${additional_modules_list_file}" use_base_dir="false" type="BINDATA" />
+      </if>
       <if expr="not is_android">
+        <include name="IDR_ABOUT_SYS_HTML" file="resources\about_sys\about_sys.html" type="BINDATA" />
+        <include name="IDR_ABOUT_SYS_CSS" file="resources\about_sys\about_sys.css" type="BINDATA" />
+        <include name="IDR_ABOUT_SYS_JS" file="resources\about_sys\about_sys.js" preprocess="true" type="BINDATA" />
+
+        <!-- Page not available for guest. -->
+        <include name="IDR_PAGE_NOT_AVAILABLE_FOR_GUEST_APP_HTML" file="resources\page_not_available_for_guest\app.html" type="BINDATA" />
+        <include name="IDR_MEDIA_ROUTER_INTERNALS_HTML" file="resources\media_router\internals\media_router_internals.html" type="BINDATA" />
+        <include name="IDR_MEDIA_ROUTER_INTERNALS_CSS" file="resources\media_router\internals\media_router_internals.css" type="BINDATA" />
+        <include name="IDR_MEDIA_ROUTER_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\media_router\internals\tsc\media_router_internals.js" use_base_dir="false" type="BINDATA" />
+        <include name="IDR_IME_WINDOW_CLOSE" file="resources\input_ime\ime_window_close.png" type="BINDATA" />
+        <include name="IDR_IME_WINDOW_CLOSE_C" file="resources\input_ime\ime_window_close_click.png" type="BINDATA" />
+        <include name="IDR_IME_WINDOW_CLOSE_H" file="resources\input_ime\ime_window_close_hover.png" type="BINDATA" />
         <!-- Chrome Cart -->
         <part file="cart/resources/cart_resources.grdp" />
       </if>
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper_unittest.cc b/chrome/browser/browsing_data/browsing_data_quota_helper_unittest.cc
index e6a8f76..8a95fd5 100644
--- a/chrome/browser/browsing_data/browsing_data_quota_helper_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_quota_helper_unittest.cc
@@ -113,7 +113,7 @@
               blink::StorageKey::CreateFromStringForTesting(data.origin)),
           data.type, future.GetCallback());
       auto bucket = future.Take();
-      EXPECT_TRUE(bucket.ok());
+      EXPECT_TRUE(bucket.has_value());
       buckets_data.insert(std::pair<storage::BucketLocator, int64_t>(
           bucket->ToBucketLocator(), data.usage));
     }
diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc
index 0b4f707..c7cec30 100644
--- a/chrome/browser/chrome_browser_main_win.cc
+++ b/chrome/browser/chrome_browser_main_win.cc
@@ -29,7 +29,6 @@
 #include "base/functional/callback_helpers.h"
 #include "base/i18n/rtl.h"
 #include "base/location.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/path_service.h"
 #include "base/scoped_native_library.h"
@@ -158,65 +157,6 @@
   std::wstring GetLocalizedString(int installer_string_id) override;
 };
 
-void DetectFaultTolerantHeap() {
-  enum FTHFlags {
-    FTH_HKLM = 1,
-    FTH_HKCU = 2,
-    FTH_ACLAYERS_LOADED = 4,
-    FTH_ACXTRNAL_LOADED = 8,
-    FTH_FLAGS_COUNT = 16
-  };
-
-  // The Fault Tolerant Heap (FTH) is enabled on some customer machines and is
-  // affecting their performance. We need to know how many machines are
-  // affected in order to decide what to do.
-
-  // The main way that the FTH is enabled is by having a value set in
-  // HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
-  // whose name is the full path to the executable and whose data is the
-  // string FaultTolerantHeap. Some documents suggest that this data may also
-  // be found in HKCU. There have also been cases observed where this registry
-  // key is set but the FTH is not enabled, so we also look for AcXtrnal.dll
-  // and AcLayers.dll which are used to implement the FTH on Windows 7 and 8
-  // respectively.
-
-  // Get the module path so that we can look for it in the registry.
-  wchar_t module_path[MAX_PATH];
-  GetModuleFileName(NULL, module_path, ARRAYSIZE(module_path));
-  // Force null-termination, necessary on Windows XP.
-  module_path[ARRAYSIZE(module_path)-1] = 0;
-
-  const wchar_t* const kRegPath = L"Software\\Microsoft\\Windows NT\\"
-        L"CurrentVersion\\AppCompatFlags\\Layers";
-  const wchar_t* const kFTHData = L"FaultTolerantHeap";
-  // We always want to read from the 64-bit version of the registry if present,
-  // since that is what the OS looks at, even for 32-bit processes.
-  const DWORD kRegFlags = KEY_READ | KEY_WOW64_64KEY;
-
-  base::win::RegKey FTH_HKLM_reg(HKEY_LOCAL_MACHINE, kRegPath, kRegFlags);
-  FTHFlags detected = FTHFlags();
-  std::wstring chrome_app_compat;
-  if (FTH_HKLM_reg.ReadValue(module_path, &chrome_app_compat) == 0) {
-    // This *usually* indicates that the fault tolerant heap is enabled.
-    if (wcsicmp(chrome_app_compat.c_str(), kFTHData) == 0)
-      detected = static_cast<FTHFlags>(detected | FTH_HKLM);
-  }
-
-  base::win::RegKey FTH_HKCU_reg(HKEY_CURRENT_USER, kRegPath, kRegFlags);
-  if (FTH_HKCU_reg.ReadValue(module_path, &chrome_app_compat) == 0) {
-    if (wcsicmp(chrome_app_compat.c_str(), kFTHData) == 0)
-      detected = static_cast<FTHFlags>(detected | FTH_HKCU);
-  }
-
-  // Look for the DLLs used to implement the FTH and other compat hacks.
-  if (GetModuleHandleW(L"AcLayers.dll") != NULL)
-    detected = static_cast<FTHFlags>(detected | FTH_ACLAYERS_LOADED);
-  if (GetModuleHandleW(L"AcXtrnal.dll") != NULL)
-    detected = static_cast<FTHFlags>(detected | FTH_ACXTRNAL_LOADED);
-
-  UMA_HISTOGRAM_ENUMERATION("FaultTolerantHeap", detected, FTH_FLAGS_COUNT);
-}
-
 void DelayedRecordProcessorMetrics() {
   mojo::Remote<chrome::mojom::ProcessorMetrics> remote_util_win =
       LaunchProcessorMetricsService();
@@ -303,8 +243,6 @@
 
   // Simple sanity check.
   got_time_date_stamp = got_time_date_stamp && size_of_image == module_size;
-  UMA_HISTOGRAM_BOOLEAN("ThirdPartyModules.TimeDateStampObtained",
-                        got_time_date_stamp);
 
   // Drop the load event if it's not possible to get the time date stamp.
   if (!got_time_date_stamp)
@@ -643,10 +581,6 @@
   } else {
     MaybePostSettingsResetPrompt();
   }
-  // Record UMA data about whether the fault-tolerant heap is enabled.
-  // Use a delayed task to minimize the impact on startup time.
-  content::GetUIThreadTaskRunner({})->PostDelayedTask(
-      FROM_HERE, base::BindOnce(&DetectFaultTolerantHeap), base::Minutes(1));
 
   // Query feature first, to include full population in field trial.
   if (base::FeatureList::IsEnabled(features::kAppBoundEncryptionMetrics) &&
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 600dd1a..92467599 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -7502,8 +7502,12 @@
   // host() is the extension-id
   const url::Origin origin = url::Origin::Create(url);
   if (origin.scheme() == extensions::kExtensionScheme) {
-    const std::string& extension_id = origin.host();
-    return extensions::util::IsChromeApp(extension_id, browser_context);
+    const Extension* extension =
+        extensions::ExtensionRegistry::Get(browser_context)
+            ->enabled_extensions()
+            .GetByID(origin.host());
+    DCHECK(extension);
+    return extension->is_platform_app();
   }
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
   return false;
diff --git a/chrome/browser/chrome_for_testing/BUILD.gn b/chrome/browser/chrome_for_testing/BUILD.gn
index 051ca17..cfd62a1 100644
--- a/chrome/browser/chrome_for_testing/BUILD.gn
+++ b/chrome/browser/chrome_for_testing/BUILD.gn
@@ -28,6 +28,24 @@
 }
 
 if (is_linux && is_chrome_for_testing) {
+  group("strip_linux_files") {
+    deps = [
+      ":strip_chrome_binary",
+      ":strip_chrome_crashpad_handler",
+      ":strip_chrome_sandbox",
+      ":strip_libEGL_shlib",
+      ":strip_libGLESv2_shlib",
+      ":strip_libvk_swiftshader_shlib",
+      ":strip_libvulkan_shlib",
+    ]
+    if (enable_nacl) {
+      deps += [
+        ":strip_nacl_helper",
+        ":strip_nacl_helper_bootstrap",
+      ]
+    }
+  }
+
   strip_binary("strip_chrome_binary") {
     binary_input = "$root_out_dir/chrome"
     deps = [ "//chrome" ]
diff --git a/chrome/browser/dips/dips_bounce_detector_browsertest.cc b/chrome/browser/dips/dips_bounce_detector_browsertest.cc
index fb0f1735..f415b44 100644
--- a/chrome/browser/dips/dips_bounce_detector_browsertest.cc
+++ b/chrome/browser/dips/dips_bounce_detector_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/strings/escape.h"
 #include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
+#include "chrome/browser/dips/dips_test_utils.h"
 #include "chrome/browser/dips/dips_utils.h"
 #include "chrome/test/base/chrome_test_utils.h"
 #include "content/public/browser/cookie_access_details.h"
@@ -65,29 +66,6 @@
   base::RunLoop run_loop_;
 };
 
-class CookieAccessObserver : public content::WebContentsObserver {
- public:
-  explicit CookieAccessObserver(content::WebContents* web_contents,
-                                content::RenderFrameHost* render_frame_host)
-      : WebContentsObserver(web_contents),
-        render_frame_host_(render_frame_host) {}
-
-  // Wait until the frame accesses cookies.
-  void Wait() { run_loop_.Run(); }
-
-  // WebContentsObserver override
-  void OnCookiesAccessed(content::RenderFrameHost* render_frame_host,
-                         const content::CookieAccessDetails& details) override {
-    if (render_frame_host_ == render_frame_host) {
-      run_loop_.Quit();
-    }
-  }
-
- private:
-  const raw_ptr<content::RenderFrameHost> render_frame_host_;
-  base::RunLoop run_loop_;
-};
-
 // Returns a simplified URL representation for ease of comparison in tests.
 // Just host+path.
 std::string FormatURL(const GURL& url) {
@@ -219,10 +197,25 @@
         base::BindRepeating(&AppendRedirects, redirects));
   }
 
+  // Navigate to /set-cookie on `host` and wait for OnCookiesAccessed() to be
+  // called.
+  [[nodiscard]] bool NavigateToSetCookie(base::StringPiece host) {
+    auto* web_contents = GetActiveWebContents();
+    const auto url =
+        embedded_test_server()->GetURL(host, "/set-cookie?name=value");
+    URLCookieAccessObserver observer(web_contents, url,
+                                     URLCookieAccessObserver::Type::kChange);
+    bool success = content::NavigateToURL(web_contents, url);
+    if (success) {
+      observer.Wait();
+    }
+    return success;
+  }
+
   void CreateImageAndWaitForCookieAccess(const GURL& image_url) {
     WebContents* web_contents = GetActiveWebContents();
-    CookieAccessObserver observer(web_contents,
-                                  web_contents->GetPrimaryMainFrame());
+    URLCookieAccessObserver observer(web_contents, image_url,
+                                     URLCookieAccessObserver::Type::kRead);
     ASSERT_TRUE(content::ExecJs(web_contents,
                                 content::JsReplace(
                                     R"(
@@ -276,25 +269,20 @@
   content::WebContents* web_contents = GetActiveWebContents();
 
   // Set cookies on all 4 test domains
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents,
-      embedded_test_server()->GetURL("a.test", "/set-cookie?name=value")));
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents,
-      embedded_test_server()->GetURL("b.test", "/set-cookie?name=value")));
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents,
-      embedded_test_server()->GetURL("c.test", "/set-cookie?name=value")));
-  ASSERT_TRUE(content::NavigateToURL(
-      web_contents,
-      embedded_test_server()->GetURL("d.test", "/set-cookie?name=value")));
+  ASSERT_TRUE(NavigateToSetCookie("a.test"));
+  ASSERT_TRUE(NavigateToSetCookie("b.test"));
+  ASSERT_TRUE(NavigateToSetCookie("c.test"));
+  ASSERT_TRUE(NavigateToSetCookie("d.test"));
 
   // Start logging WebContentsObserver callbacks.
   WCOCallbackLogger::CreateForWebContents(web_contents);
   auto* logger = WCOCallbackLogger::FromWebContents(web_contents);
 
   // Visit the redirect.
+  URLCookieAccessObserver observer(web_contents, final_url,
+                                   URLCookieAccessObserver::Type::kChange);
   ASSERT_TRUE(content::NavigateToURL(web_contents, redirect_url, final_url));
+  observer.Wait();
 
   // Verify that the 7 OnCookiesAccessed() executions are called in order, and
   // all between DidStartNavigation() and DidFinishNavigation().
@@ -305,25 +293,28 @@
   // test will intentionally fail if it happens so that we'll notice.
   EXPECT_THAT(
       logger->log(),
-      ElementsAre(
-          ("DidStartNavigation(a.test/cross-site/b.test/cross-site-with-cookie/"
-           "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(NavigationHandle, Read: "
-           "a.test/cross-site/b.test/cross-site-with-cookie/c.test/"
-           "cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(NavigationHandle, Read: "
-           "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/d.test/"
-           "set-cookie)"),
-          ("OnCookiesAccessed(NavigationHandle, Change: "
-           "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/d.test/"
-           "set-cookie)"),
-          ("OnCookiesAccessed(NavigationHandle, Read: "
-           "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          ("OnCookiesAccessed(NavigationHandle, Change: "
-           "c.test/cross-site-with-cookie/d.test/set-cookie)"),
-          "OnCookiesAccessed(NavigationHandle, Read: d.test/set-cookie)",
-          "OnCookiesAccessed(NavigationHandle, Change: d.test/set-cookie)",
-          "DidFinishNavigation(d.test/set-cookie)"));
+      testing::ContainerEq(std::vector<std::string>(
+          {("DidStartNavigation(a.test/cross-site/b.test/"
+            "cross-site-with-cookie/"
+            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
+           ("OnCookiesAccessed(NavigationHandle, Read: "
+            "a.test/cross-site/b.test/cross-site-with-cookie/c.test/"
+            "cross-site-with-cookie/d.test/set-cookie)"),
+           ("OnCookiesAccessed(NavigationHandle, Read: "
+            "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/"
+            "d.test/"
+            "set-cookie)"),
+           ("OnCookiesAccessed(NavigationHandle, Change: "
+            "b.test/cross-site-with-cookie/c.test/cross-site-with-cookie/"
+            "d.test/"
+            "set-cookie)"),
+           ("OnCookiesAccessed(NavigationHandle, Read: "
+            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
+           ("OnCookiesAccessed(NavigationHandle, Change: "
+            "c.test/cross-site-with-cookie/d.test/set-cookie)"),
+           "OnCookiesAccessed(NavigationHandle, Read: d.test/set-cookie)",
+           "OnCookiesAccessed(NavigationHandle, Change: d.test/set-cookie)",
+           "DidFinishNavigation(d.test/set-cookie)"})));
 }
 
 // An EmbeddedTestServer request handler for
@@ -334,8 +325,9 @@
     net::EmbeddedTestServer* server,
     const net::test_server::HttpRequest& request) {
   const std::string prefix = "/cross-site-with-samesite-none-cookie";
-  if (!net::test_server::ShouldHandle(request, prefix))
+  if (!net::test_server::ShouldHandle(request, prefix)) {
     return nullptr;
+  }
 
   std::string dest_all = base::UnescapeBinaryURLComponent(
       request.relative_url.substr(prefix.size() + 1));
diff --git a/chrome/browser/dips/dips_helper_browsertest.cc b/chrome/browser/dips/dips_helper_browsertest.cc
index 10094ff..b2f8029 100644
--- a/chrome/browser/dips/dips_helper_browsertest.cc
+++ b/chrome/browser/dips/dips_helper_browsertest.cc
@@ -99,38 +99,6 @@
   base::RunLoop run_loop_;
 };
 
-class URLCookieAccessObserver : public content::WebContentsObserver {
- public:
-  explicit URLCookieAccessObserver(WebContents* web_contents,
-                                   const GURL& url,
-                                   CookieAccessDetails::Type access_type)
-      : WebContentsObserver(web_contents),
-        url_(url),
-        access_type_(access_type) {}
-
-  // Wait until the frame accesses cookies.
-  void Wait() { run_loop_.Run(); }
-
-  // WebContentsObserver overrides
-  void OnCookiesAccessed(RenderFrameHost* render_frame_host,
-                         const CookieAccessDetails& details) override {
-    if (details.type == access_type_ && details.url == url_) {
-      run_loop_.Quit();
-    }
-  }
-  void OnCookiesAccessed(NavigationHandle* navigation_handle,
-                         const CookieAccessDetails& details) override {
-    if (details.type == access_type_ && details.url == url_) {
-      run_loop_.Quit();
-    }
-  }
-
- private:
-  GURL url_;
-  CookieAccessDetails::Type access_type_;
-  base::RunLoop run_loop_;
-};
-
 using StateForURLCallback = base::OnceCallback<void(const DIPSState&)>;
 
 // Histogram names
diff --git a/chrome/browser/dips/dips_test_utils.cc b/chrome/browser/dips/dips_test_utils.cc
index 8bdfbfc1..cb1198dca 100644
--- a/chrome/browser/dips/dips_test_utils.cc
+++ b/chrome/browser/dips/dips_test_utils.cc
@@ -3,8 +3,39 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/dips/dips_test_utils.h"
+#include "content/public/browser/web_contents.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
+using content::CookieAccessDetails;
+using content::NavigationHandle;
+using content::RenderFrameHost;
+using content::WebContents;
+
+URLCookieAccessObserver::URLCookieAccessObserver(WebContents* web_contents,
+                                                 const GURL& url,
+                                                 Type access_type)
+    : WebContentsObserver(web_contents), url_(url), access_type_(access_type) {}
+
+void URLCookieAccessObserver::Wait() {
+  run_loop_.Run();
+}
+
+void URLCookieAccessObserver::OnCookiesAccessed(
+    RenderFrameHost* render_frame_host,
+    const CookieAccessDetails& details) {
+  if (details.type == access_type_ && details.url == url_) {
+    run_loop_.Quit();
+  }
+}
+
+void URLCookieAccessObserver::OnCookiesAccessed(
+    NavigationHandle* navigation_handle,
+    const CookieAccessDetails& details) {
+  if (details.type == access_type_ && details.url == url_) {
+    run_loop_.Quit();
+  }
+}
+
 RedirectChainObserver::RedirectChainObserver(DIPSService* service,
                                              GURL final_url)
     : final_url_(std::move(final_url)) {
diff --git a/chrome/browser/dips/dips_test_utils.h b/chrome/browser/dips/dips_test_utils.h
index 5fd034b4..a40a12b 100644
--- a/chrome/browser/dips/dips_test_utils.h
+++ b/chrome/browser/dips/dips_test_utils.h
@@ -14,12 +14,35 @@
 #include "chrome/browser/dips/dips_redirect_info.h"
 #include "chrome/browser/dips/dips_service.h"
 #include "components/ukm/test_ukm_recorder.h"
+#include "content/public/browser/cookie_access_details.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "url/gurl.h"
 
 namespace testing {
 class MatchResultListener;
 }
 
+class URLCookieAccessObserver : public content::WebContentsObserver {
+ public:
+  using Type = content::CookieAccessDetails::Type;
+  URLCookieAccessObserver(content::WebContents* web_contents,
+                          const GURL& url,
+                          Type access_type);
+
+  void Wait();
+
+ private:
+  // WebContentsObserver overrides
+  void OnCookiesAccessed(content::RenderFrameHost* render_frame_host,
+                         const content::CookieAccessDetails& details) override;
+  void OnCookiesAccessed(content::NavigationHandle* navigation_handle,
+                         const content::CookieAccessDetails& details) override;
+
+  GURL url_;
+  Type access_type_;
+  base::RunLoop run_loop_;
+};
+
 class RedirectChainObserver : public DIPSService::Observer {
  public:
   explicit RedirectChainObserver(DIPSService* service, GURL final_url);
diff --git a/chrome/browser/download/download_item_model.cc b/chrome/browser/download/download_item_model.cc
index 1a6cd811..4fe68bf 100644
--- a/chrome/browser/download/download_item_model.cc
+++ b/chrome/browser/download/download_item_model.cc
@@ -56,6 +56,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/time_format.h"
 #include "ui/base/text/bytes_formatting.h"
+#include "ui/color/color_id.h"
 
 #if !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/ui/browser.h"
@@ -935,7 +936,8 @@
                l10n_util::GetStringUTF16(
                    IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_SUSPICIOUS_ARCHIVE))
         .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                         ui::kColorAlertMediumSeverity)
+                         ui::kColorAlertMediumSeverityIcon)
+        .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
         .AddPrimaryButton(DownloadCommands::Command::DISCARD)
         .AddSubpageButton(l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
                           DownloadCommands::Command::DISCARD,
diff --git a/chrome/browser/download/download_ui_model.cc b/chrome/browser/download/download_ui_model.cc
index 4e4fcc60..c1abeb54 100644
--- a/chrome/browser/download/download_ui_model.cc
+++ b/chrome/browser/download/download_ui_model.cc
@@ -31,6 +31,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/time_format.h"
 #include "ui/base/text/bytes_formatting.h"
+#include "ui/color/color_id.h"
 
 #if !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/ui/browser.h"
@@ -742,6 +743,11 @@
   icon_model_override = &vector_icon;
   return *this;
 }
+DownloadUIModel::BubbleUIInfo&
+DownloadUIModel::BubbleUIInfo::AddSecondaryTextColor(ui::ColorId color_id) {
+  secondary_text_color = color_id;
+  return *this;
+}
 DownloadUIModel::BubbleUIInfo& DownloadUIModel::BubbleUIInfo::AddPrimaryButton(
     DownloadCommands::Command command) {
   primary_button_command = command;
@@ -777,6 +783,10 @@
   return *this;
 }
 
+ui::ColorId DownloadUIModel::BubbleUIInfo::GetColorForSecondaryText() const {
+  return secondary_text_color.value_or(secondary_color);
+}
+
 DownloadUIModel::BubbleUIInfo DownloadUIModel::GetBubbleUIInfoForInterrupted(
     FailState fail_state) const {
   // Only handle danger types that are terminated in the interrupted state in
@@ -917,7 +927,8 @@
                  l10n_util::GetStringUTF16(
                      IDS_DOWNLOAD_BUBBLE_WARNING_SUBPAGE_SUMMARY_INSECURE))
           .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                           ui::kColorAlertMediumSeverity)
+                           ui::kColorAlertMediumSeverityIcon)
+          .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
           .AddSubpageButton(
               l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
               DownloadCommands::Command::DISCARD,
@@ -943,11 +954,14 @@
       case download::DOWNLOAD_DANGER_TYPE_POTENTIALLY_UNWANTED:
         return DownloadUIModel::BubbleUIInfo(/*has_progress_bar=*/false)
             .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                             ui::kColorAlertMediumSeverity)
+                             ui::kColorAlertMediumSeverityIcon)
+            .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
             .AddPrimaryButton(DownloadCommands::Command::REVIEW);
       case download::DOWNLOAD_DANGER_TYPE_SENSITIVE_CONTENT_WARNING:
         return DownloadUIModel::BubbleUIInfo(/*has_progress_bar=*/false)
-            .AddIconAndColor(views::kInfoIcon, ui::kColorAlertMediumSeverity)
+            .AddIconAndColor(views::kInfoIcon,
+                             ui::kColorAlertMediumSeverityIcon)
+            .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
             .AddPrimaryButton(DownloadCommands::Command::REVIEW);
       default:
         break;
@@ -968,7 +982,8 @@
                        l10n_util::GetStringUTF16(
                            IDS_EXTENSION_WEB_STORE_TITLE)))
             .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                             ui::kColorAlertMediumSeverity)
+                             ui::kColorAlertMediumSeverityIcon)
+            .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
             .AddSubpageButton(
                 l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
                 DownloadCommands::Command::DISCARD,
@@ -1022,7 +1037,8 @@
                     l10n_util::GetStringUTF16(
                         IDS_DOWNLOAD_BUBBLE_MALICIOUS_URL_BLOCKED))
                     .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                                     ui::kColorAlertMediumSeverity)
+                                     ui::kColorAlertMediumSeverityIcon)
+                    .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
                     .AddPrimaryButton(DownloadCommands::Command::DISCARD)
                     .AddSubpageButton(
                         l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
@@ -1073,7 +1089,8 @@
                    l10n_util::GetStringUTF16(
                        IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_ADVANCED_PROTECTION))
             .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                             ui::kColorAlertMediumSeverity)
+                             ui::kColorAlertMediumSeverityIcon)
+            .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
             .AddSubpageButton(
                 l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
                 DownloadCommands::Command::DISCARD,
@@ -1087,7 +1104,8 @@
                    l10n_util::GetStringUTF16(
                        IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_UNCOMMON_FILE))
             .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                             ui::kColorAlertMediumSeverity)
+                             ui::kColorAlertMediumSeverityIcon)
+            .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
             .AddPrimaryButton(DownloadCommands::Command::DISCARD)
             .AddSubpageButton(
                 l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
@@ -1103,7 +1121,8 @@
       return DownloadUIModel::BubbleUIInfo(
                  l10n_util::GetStringUTF16(
                      IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_SENSITIVE_CONTENT_WARNING))
-          .AddIconAndColor(views::kInfoIcon, ui::kColorAlertMediumSeverity)
+          .AddIconAndColor(views::kInfoIcon, ui::kColorAlertMediumSeverityIcon)
+          .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
           .AddPrimaryButton(DownloadCommands::Command::DISCARD)
           .AddSubpageButton(
               l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_DELETE),
@@ -1118,7 +1137,8 @@
                  l10n_util::GetStringUTF16(
                      IDS_DOWNLOAD_BUBBLE_SUBPAGE_SUMMARY_DEEP_SCANNING_PROMPT))
           .AddIconAndColor(vector_icons::kNotSecureWarningIcon,
-                           ui::kColorAlertMediumSeverity)
+                           ui::kColorAlertMediumSeverityIcon)
+          .AddSecondaryTextColor(ui::kColorAlertMediumSeverityText)
           .AddPrimaryButton(DownloadCommands::Command::DEEP_SCAN)
           .AddSubpageButton(l10n_util::GetStringUTF16(IDS_DOWNLOAD_BUBBLE_SCAN),
                             DownloadCommands::Command::DEEP_SCAN,
diff --git a/chrome/browser/download/download_ui_model.h b/chrome/browser/download/download_ui_model.h
index 4b9e0f62..47bc4d7 100644
--- a/chrome/browser/download/download_ui_model.h
+++ b/chrome/browser/download/download_ui_model.h
@@ -19,6 +19,7 @@
 #include "components/offline_items_collection/core/offline_item.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/content/common/proto/download_file_types.pb.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/models/image_model.h"
 #include "ui/color/color_id.h"
 #include "ui/gfx/vector_icon_types.h"
@@ -131,9 +132,13 @@
     // has a progress bar and a cancel button.
     bool has_progress_bar = false;
     bool is_progress_bar_looping = false;
-    // kColorAlertHighSeverity, kColorAlertMediumSeverity, or
+    // kColorAlertHighSeverity, kColorAlertMediumSeverityIcon, or
     // kColorSecondaryForeground
     ui::ColorId secondary_color = ui::kColorSecondaryForeground;
+    // Color used for alert text, which may be different from |secondary_color|,
+    // used for icons. If this is nullopt, |secondary_color| will be used for
+    // text.
+    absl::optional<ui::ColorId> secondary_text_color = absl::nullopt;
 
     // Override icon
     raw_ptr<const gfx::VectorIcon> icon_model_override = nullptr;
@@ -164,6 +169,7 @@
     BubbleUIInfo(const BubbleUIInfo&);
     BubbleUIInfo& AddIconAndColor(const gfx::VectorIcon& vector_icon,
                                   ui::ColorId color_id);
+    BubbleUIInfo& AddSecondaryTextColor(ui::ColorId color_id);
     BubbleUIInfo& AddPrimaryButton(DownloadCommands::Command command);
     BubbleUIInfo& AddCheckbox(const std::u16string& label);
     // Add button to the subpage. Only two buttons are supported.
@@ -176,6 +182,7 @@
     BubbleUIInfo& AddQuickAction(DownloadCommands::Command command,
                                  const std::u16string& label,
                                  const gfx::VectorIcon* icon);
+    ui::ColorId GetColorForSecondaryText() const;
   };
 #endif
 
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
index 37d9a2a..ee73ef66d 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -736,7 +736,7 @@
     case State::FAILURE:
       return ui::kColorAlertHighSeverity;
     case State::WARNING:
-      return ui::kColorAlertMediumSeverity;
+      return ui::kColorAlertMediumSeverityIcon;
   }
 }
 
diff --git a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.cc b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.cc
index 6a322ac0..cb2d2421 100644
--- a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.cc
+++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.cc
@@ -18,7 +18,7 @@
 }
 
 int FakeContentAnalysisSdkClient::Send(
-    const content_analysis::sdk::ContentAnalysisRequest& request,
+    content_analysis::sdk::ContentAnalysisRequest request,
     content_analysis::sdk::ContentAnalysisResponse* response) {
   request_ = request;
   // To correlate request and response, just like what the real agent should do.
@@ -38,6 +38,11 @@
   return cancel_status_;
 }
 
+const content_analysis::sdk::AgentInfo&
+FakeContentAnalysisSdkClient::GetAgentInfo() const {
+  return agent_info_;
+}
+
 const content_analysis::sdk::ContentAnalysisRequest&
 FakeContentAnalysisSdkClient::GetRequest() {
   return request_;
@@ -65,4 +70,9 @@
   response_ = response;
 }
 
+void FakeContentAnalysisSdkClient::SetAgentInfo(
+    const content_analysis::sdk::AgentInfo& agent_info) {
+  agent_info_ = agent_info;
+}
+
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.h b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.h
index 506f518b..2d8b5f8 100644
--- a/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.h
+++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_sdk_client.h
@@ -19,12 +19,13 @@
 
   // content_analysis::sdk::Client:
   const content_analysis::sdk::Client::Config& GetConfig() const override;
-  int Send(const content_analysis::sdk::ContentAnalysisRequest& request,
+  int Send(content_analysis::sdk::ContentAnalysisRequest request,
            content_analysis::sdk::ContentAnalysisResponse* response) override;
   int Acknowledge(const content_analysis::sdk::ContentAnalysisAcknowledgement&
                       ack) override;
   int CancelRequests(const content_analysis::sdk::ContentAnalysisCancelRequests&
                          cancel) override;
+  const content_analysis::sdk::AgentInfo& GetAgentInfo() const override;
 
   // Get the latest request client receives.
   const content_analysis::sdk::ContentAnalysisRequest& GetRequest();
@@ -46,6 +47,9 @@
   void SetSendResponse(
       const content_analysis::sdk::ContentAnalysisResponse& response);
 
+  // Configure agent info.
+  void SetAgentInfo(const content_analysis::sdk::AgentInfo& agent_info);
+
  private:
   content_analysis::sdk::Client::Config config_;
   content_analysis::sdk::ContentAnalysisResponse response_;
@@ -54,6 +58,7 @@
   int send_status_ = 0;
   int ack_status_ = 0;
   int cancel_status_ = 0;
+  content_analysis::sdk::AgentInfo agent_info_;
 };
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
index ea8d591..f0271d73 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
@@ -48,7 +48,7 @@
   TestNetworkingPrivateDelegate& operator=(
       const TestNetworkingPrivateDelegate&) = delete;
 
-  ~TestNetworkingPrivateDelegate() override {}
+  ~TestNetworkingPrivateDelegate() override = default;
 
   // Asynchronous methods
   void GetProperties(const std::string& guid,
@@ -77,7 +77,7 @@
   }
 
   void CreateNetwork(bool shared,
-                     base::Value properties,
+                     base::Value::Dict properties,
                      StringCallback success_callback,
                      FailureCallback failure_callback) override {
     StringResult(std::move(success_callback), std::move(failure_callback),
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index dce94ed9..4526c3a3 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -30,7 +30,6 @@
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/extension_allowlist.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/scoped_active_install.h"
 #include "chrome/browser/profiles/profile.h"
@@ -58,6 +57,7 @@
 #include "extensions/browser/extension_function_constants.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_constants.h"
diff --git a/chrome/browser/extensions/extension_install_prompt_unittest.cc b/chrome/browser/extensions/extension_install_prompt_unittest.cc
index 1221f80b..051bb16 100644
--- a/chrome/browser/extensions/extension_install_prompt_unittest.cc
+++ b/chrome/browser/extensions/extension_install_prompt_unittest.cc
@@ -17,12 +17,12 @@
 #include "base/test/test_future.h"
 #include "chrome/browser/extensions/extension_install_prompt_show_params.h"
 #include "chrome/browser/extensions/extension_service_test_with_install.h"
-#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_web_contents_factory.h"
 #include "content/public/test/web_contents_tester.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/browser/image_loader.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 06bfe9ba..034a426 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -392,8 +392,6 @@
   on_app_terminating_subscription_ =
       browser_shutdown::AddAppTerminatingCallback(base::BindOnce(
           &ExtensionService::OnAppTerminating, base::Unretained(this)));
-  registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
-                 content::NotificationService::AllBrowserContextsAndSources());
 
   host_registry_observation_.Observe(ExtensionHostRegistry::Get(profile));
 
@@ -2015,23 +2013,28 @@
   browser_terminating_ = true;
 }
 
-void ExtensionService::Observe(int type,
-                               const content::NotificationSource& source,
-                               const content::NotificationDetails& details) {
-  DCHECK(type == content::NOTIFICATION_RENDERER_PROCESS_TERMINATED);
-  content::RenderProcessHost* process =
-      content::Source<content::RenderProcessHost>(source).ptr();
+void ExtensionService::OnRenderProcessHostCreated(
+    content::RenderProcessHost* host) {
+  if (!host_observation_.IsObservingSource(host)) {
+    host_observation_.AddObservation(host);
+  }
+}
+
+void ExtensionService::RenderProcessHostDestroyed(
+    content::RenderProcessHost* host) {
+  host_observation_.RemoveObservation(host);
+
   Profile* host_profile =
-      Profile::FromBrowserContext(process->GetBrowserContext());
+      Profile::FromBrowserContext(host->GetBrowserContext());
   if (!profile_->IsSameOrParent(host_profile->GetOriginalProfile()))
     return;
 
   ProcessMap* process_map = ProcessMap::Get(profile_);
-  if (process_map->Contains(process->GetID())) {
+  if (process_map->Contains(host->GetID())) {
     // An extension process was terminated, this might have resulted in an
     // app or extension becoming idle.
     std::set<std::string> extension_ids =
-        process_map->GetExtensionsInProcess(process->GetID());
+        process_map->GetExtensionsInProcess(host->GetID());
     // In addition to the extensions listed in the process map, one of those
     // extensions could be referencing a shared module which is waiting for
     // idle to update. Check all imports of these extensions, too.
@@ -2062,7 +2065,7 @@
       }
     }
   }
-  process_map->RemoveAllFromProcess(process->GetID());
+  process_map->RemoveAllFromProcess(host->GetID());
 }
 
 int ExtensionService::GetDisableReasonsOnInstalled(const Extension* extension) {
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index b004194..80c697d 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -17,6 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/scoped_multi_source_observation.h"
 #include "base/scoped_observation.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/blocklist.h"
@@ -32,8 +33,8 @@
 #include "chrome/browser/profiles/profile_manager_observer.h"
 #include "chrome/browser/upgrade_detector/upgrade_observer.h"
 #include "components/sync/model/string_ordinal.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_process_host_creation_observer.h"
 #include "extensions/browser/api/declarative_net_request/ruleset_install_pref.h"
 #include "extensions/browser/crx_file_info.h"
 #include "extensions/browser/disable_reason.h"
@@ -169,7 +170,8 @@
 // between normal and incognito profiles.
 class ExtensionService : public ExtensionServiceInterface,
                          public ExternalProviderInterface::VisitorInterface,
-                         public content::NotificationObserver,
+                         public content::RenderProcessHostCreationObserver,
+                         public content::RenderProcessHostObserver,
                          public Blocklist::Observer,
                          public ExtensionManagement::Observer,
                          public UpgradeObserver,
@@ -514,10 +516,11 @@
 
   void OnAppTerminating();
 
-  // content::NotificationObserver implementation:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
+  // content::RenderProcessHostCreationObserver:
+  void OnRenderProcessHostCreated(content::RenderProcessHost* host) override;
+
+  // content::RenderProcessHostObserver:
+  void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
 
   // Blocklist::Observer implementation.
   void OnBlocklistUpdated() override;
@@ -695,7 +698,10 @@
   std::unique_ptr<ExtensionUpdater> updater_;
 
   base::CallbackListSubscription on_app_terminating_subscription_;
-  content::NotificationRegistrar registrar_;
+
+  base::ScopedMultiSourceObservation<content::RenderProcessHost,
+                                     content::RenderProcessHostObserver>
+      host_observation_{this};
 
   // Keeps track of loading and unloading component extensions.
   std::unique_ptr<ComponentLoader> component_loader_;
diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc
index c4fa9fb..0559630 100644
--- a/chrome/browser/extensions/extension_util.cc
+++ b/chrome/browser/extensions/extension_util.cc
@@ -34,8 +34,6 @@
 #include "extensions/common/manifest_handlers/incognito_info.h"
 #include "extensions/common/manifest_handlers/permissions_parser.h"
 #include "extensions/common/permissions/permissions_data.h"
-#include "extensions/grit/extensions_browser_resources.h"
-#include "ui/base/resource/resource_bundle.h"
 #include "url/gurl.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -94,14 +92,6 @@
   return extension && AppIsolationInfo::HasIsolatedStorage(extension);
 }
 
-bool IsChromeApp(const std::string& extension_id,
-                 content::BrowserContext* context) {
-  const Extension* extension =
-      ExtensionRegistry::Get(context)->enabled_extensions().GetByID(
-          extension_id);
-  return extension->is_platform_app();
-}
-
 void SetIsIncognitoEnabled(const std::string& extension_id,
                            content::BrowserContext* context,
                            bool enabled) {
@@ -252,16 +242,6 @@
   return dict;
 }
 
-const gfx::ImageSkia& GetDefaultAppIcon() {
-  return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-      IDR_APP_DEFAULT_ICON);
-}
-
-const gfx::ImageSkia& GetDefaultExtensionIcon() {
-  return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-      IDR_EXTENSION_DEFAULT_ICON);
-}
-
 std::unique_ptr<const PermissionSet> GetInstallPromptPermissionSetForExtension(
     const Extension* extension,
     Profile* profile,
diff --git a/chrome/browser/extensions/extension_util.h b/chrome/browser/extensions/extension_util.h
index 48a16de3..2d4d76d8 100644
--- a/chrome/browser/extensions/extension_util.h
+++ b/chrome/browser/extensions/extension_util.h
@@ -19,10 +19,6 @@
 class PermissionSet;
 }
 
-namespace gfx {
-class ImageSkia;
-}
-
 class Profile;
 
 namespace extensions {
@@ -38,10 +34,6 @@
 bool HasIsolatedStorage(const std::string& extension_id,
                         content::BrowserContext* context);
 
-// Returns true if the extension associated with `extension_id` is a Chrome App.
-bool IsChromeApp(const std::string& extension_id,
-                 content::BrowserContext* context);
-
 // Sets whether |extension_id| can run in an incognito window. Reloads the
 // extension if it's enabled since this permission is applied at loading time
 // only. Note that an ExtensionService must exist.
@@ -72,11 +64,6 @@
 // returned dictionary.
 base::Value::Dict GetExtensionInfo(const Extension* extension);
 
-// Returns the default extension/app icon (for extensions or apps that don't
-// have one).
-const gfx::ImageSkia& GetDefaultExtensionIcon();
-const gfx::ImageSkia& GetDefaultAppIcon();
-
 // Returns a PermissionSet configured with the permissions that should be
 // displayed in an extension installation prompt for the specified |extension|.
 std::unique_ptr<const PermissionSet> GetInstallPromptPermissionSetForExtension(
diff --git a/chrome/browser/extensions/extension_view_host.cc b/chrome/browser/extensions/extension_view_host.cc
index 2a238b5..62b0e06 100644
--- a/chrome/browser/extensions/extension_view_host.cc
+++ b/chrome/browser/extensions/extension_view_host.cc
@@ -53,13 +53,6 @@
   // in TabHelpers::AttachTabHelpers, but popups don't.
   // TODO(kalman): How much of TabHelpers::AttachTabHelpers should be here?
   autofill::ChromeAutofillClient::CreateForWebContents(host_contents());
-  autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      host_contents(),
-      autofill::ChromeAutofillClient::FromWebContents(host_contents()),
-      base::BindRepeating(
-          &autofill::BrowserDriverInitHook,
-          autofill::ChromeAutofillClient::FromWebContents(host_contents()),
-          g_browser_process->GetApplicationLocale()));
 
   // The popup itself cannot be zoomed, but we must specify a zoom level to use.
   // Otherwise, if a user zooms a page of the same extension, the popup would
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 39fd710f..a4ea0e6 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -194,7 +194,7 @@
   {
     "name": "app-store-rating",
     "owners": [ "hiramahmood@google.com", "bling-flags@google.com" ],
-    "expiry_milestone": 112
+    "expiry_milestone": 114
   },
   {
     "name": "arc-custom-tabs-experiment",
@@ -492,7 +492,7 @@
   {
     "name": "autofill-enable-fido-progress-dialog",
     "owners": [ "siashah", "yiian" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 120
   },
   {
     "name": "autofill-enable-iban-client-side-url-filtering",
@@ -712,11 +712,6 @@
     "expiry_milestone": 115
   },
   {
-    "name": "binding-manager-use-not-perceptible-binding",
-    "owners": ["ckitagawa", "yfriedman"],
-    "expiry_milestone": 115
-  },
-  {
     "name": "biometric-authentication-for-filling",
     "owners": ["vsemeniuk@google.com", "vasilii"],
     "expiry_milestone": 117
@@ -1290,11 +1285,6 @@
     "expiry_milestone": 120
   },
   {
-    "name": "cryptauth-v2-dedup-device-last-activity-time",
-    "owners": ["pushi@google.com", "chromeos-cross-device-eng@google.com"],
-    "expiry_milestone": 102
-  },
-  {
     "name": "cups-ipp-printing-backend",
     "owners": [ "awscreen", "//printing/OWNERS" ],
     "expiry_milestone": 120
@@ -2975,11 +2965,6 @@
     "expiry_milestone": 108
   },
   {
-    "name": "enable-projector-exclude-transcript",
-    "owners": [ "llin", "cros-projector@google.com" ],
-    "expiry_milestone": 105
-  },
-  {
     "name": "enable-projector-local-playback",
     "owners": [ "tobyhuang", "cros-projector@google.com" ],
     "expiry_milestone": 108
@@ -3703,31 +3688,43 @@
   },
   {
     "name": "fast-pair",
-    "owners": [ "//ash/quick_pair/OWNERS", "jonmann@chromium.org" ],
-    "expiry_milestone": 112
+    "owners": [
+      "//ash/quick_pair/OWNERS",
+      "jackshira"
+    ],
+    "expiry_milestone": 114
   },
   {
     "name": "fast-pair-handshake-refactor",
-    "owners": [ "//ash/quick_pair/OWNERS", "akingsb@google.com" ],
-    "expiry_milestone": 112
+    "owners": [
+      "//ash/quick_pair/OWNERS",
+      "jackshira"
+    ],
+    "expiry_milestone": 114
   },
   {
     "name": "fast-pair-low-power",
     "owners": [
       "//ash/quick_pair/OWNERS",
-      "jonmann@chromium.org"
+      "jackshira"
     ],
-    "expiry_milestone": 112
+    "expiry_milestone": 114
   },
   {
     "name": "fast-pair-saved-devices",
-    "owners": [ "//ash/quick_pair/OWNERS", "julietlevesque@google.com" ],
-    "expiry_milestone": 112
+    "owners": [
+      "//ash/quick_pair/OWNERS",
+      "jackshira"
+    ],
+    "expiry_milestone": 114
   },
   {
     "name": "fast-pair-software-scanning",
-    "owners": [ "//ash/quick_pair/OWNERS", "jonmann@chromium.org" ],
-    "expiry_milestone": 112
+    "owners": [
+      "//ash/quick_pair/OWNERS",
+      "jackshira"
+    ],
+    "expiry_milestone": 114
   },
   {
     "name": "feature-notification-guide",
@@ -4182,7 +4179,7 @@
   {
     "name": "hidden-network-migration",
     "owners": [ "chadduffin", "hsuregan", "cros-connectivity@google.com" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 115
   },
   {
     "name": "hide-non-displayable-account-email",
@@ -4462,7 +4459,7 @@
   {
     "name": "ios-new-post-restore-experience",
     "owners": [ "scottyoder@google.com", "bling-flags@google.com" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 114
   },
   {
     "name": "ios-password-checkup",
@@ -4734,7 +4731,7 @@
   {
     "name": "mac-address-randomization",
     "owners": [ "chadduffin", "cros-connectivity@google.com"],
-    "expiry_milestone": 113
+    "expiry_milestone": 125
   },
   {
     "name": "mac-syscall-sandbox",
@@ -4950,7 +4947,7 @@
   {
     "name": "new-overflow-menu-share-chrome-action",
     "owners": [ "scottyoder@google.com", "bling-flags@google.com" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 114
   },
   {
     "name": "new-shortcut-mapping",
@@ -5014,12 +5011,12 @@
   {
     "name": "ntp-comprehensive-theme-realbox",
     "owners": [ "romanarora", "tiborg", "tluk" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 116
   },
   {
     "name": "ntp-comprehensive-theming",
     "owners": [ "romanarora", "tiborg", "tluk" ],
-    "expiry_milestone": 113
+    "expiry_milestone": 116
   },
   {
     "name": "ntp-desktop-lens",
@@ -6560,6 +6557,11 @@
     "expiry_milestone": 114
   },
   {
+    "name": "slim-compositor",
+    "owners": [ "boliu", "kylechar" ],
+    "expiry_milestone": 119
+  },
+  {
     "name": "smart-sorting-new-overflow-menu",
     "owners": [ "bwwilliams@google.com", "bling-flags@google.com" ],
     "expiry_milestone": 114
@@ -7310,7 +7312,7 @@
   {
     "name": "web-sql-access",
     "owners": [ "arichiv"],
-    "expiry_milestone": 113
+    "expiry_milestone": 124
   },
   {
     "name": "webnotes-dynamic-templates",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 61b5cd9..77d530d 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3548,12 +3548,6 @@
     "least important background renderers, which may cause them to be "
     "reclaimed by the OS if memory is needed.";
 
-const char kBindingManagerUseNotPerceptibleBindingName[] =
-    "Reduced background renderer binding";
-const char kBindingManagerUseNotPerceptibleBindingDescription[] =
-    "When enabled, uses a not perceptible binding for background renderers "
-    "used in the current session if able.";
-
 const char kCCTBrandTransparencyName[] =
     "Chrome Custom Tabs Brand Transparency";
 const char kCCTBrandTransparencyDescription[] =
@@ -4033,6 +4027,9 @@
     "Security mode that enables site isolation for sites based on "
     "password-oriented heuristics, such as a user typing in a password.";
 
+const char kSlimCompositorName[] = "Slim browser compositor";
+const char kSlimCompositorDescription[] = "Use new simpler browser compositor";
+
 const char kSmartSuggestionForLargeDownloadsName[] =
     "Smart suggestion for large downloads";
 const char kSmartSuggestionForLargeDownloadsDescription[] =
@@ -5103,12 +5100,6 @@
     "Enable this flag to show warning and handle the video recording when "
     "device storage is running low";
 
-const char kCryptAuthV2DedupDeviceLastActivityTimeName[] =
-    "Dedup devices by last activity time";
-const char kCryptAuthV2DedupDeviceLastActivityTimeDescription[] =
-    "Deduplicates phones in multi-device setup drop-down list by last "
-    "activity time";
-
 const char kDisableBufferBWCompressionName[] =
     "Disable buffer bandwidth compression";
 const char kDisableBufferBWCompressionDescription[] =
@@ -5881,11 +5872,6 @@
 const char kProjectorDescription[] =
     "Enables Projects SWA and associated recording tools";
 
-const char kProjectorExcludeTranscriptName[] =
-    "Enable Projector exclude transcript feature";
-const char kProjectorExcludeTranscriptDescription[] =
-    "Supports excluding segment of Projector recording by excluding transcript";
-
 const char kProjectorLocalPlaybackName[] = "Enable Projector local playback";
 const char kProjectorLocalPlaybackDescription[] =
     "Supports streaming screencast videos from DriveFS instead of Drive before "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index a93bcd6..debccc6 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2025,9 +2025,6 @@
 extern const char kBindingManagerConnectionLimitName[];
 extern const char kBindingManagerConnectionLimitDescription[];
 
-extern const char kBindingManagerUseNotPerceptibleBindingName[];
-extern const char kBindingManagerUseNotPerceptibleBindingDescription[];
-
 extern const char kCCTBrandTransparencyName[];
 extern const char kCCTBrandTransparencyDescription[];
 
@@ -2309,6 +2306,9 @@
 extern const char kSiteIsolationForPasswordSitesName[];
 extern const char kSiteIsolationForPasswordSitesDescription[];
 
+extern const char kSlimCompositorName[];
+extern const char kSlimCompositorDescription[];
+
 extern const char kSmartSuggestionForLargeDownloadsName[];
 extern const char kSmartSuggestionForLargeDownloadsDescription[];
 
@@ -2929,9 +2929,6 @@
 extern const char kCameraAppLowStorageWarningName[];
 extern const char kCameraAppLowStorageWarningDescription[];
 
-extern const char kCryptAuthV2DedupDeviceLastActivityTimeName[];
-extern const char kCryptAuthV2DedupDeviceLastActivityTimeDescription[];
-
 extern const char kDisableBufferBWCompressionName[];
 extern const char kDisableBufferBWCompressionDescription[];
 
@@ -3374,9 +3371,6 @@
 extern const char kProjectorName[];
 extern const char kProjectorDescription[];
 
-extern const char kProjectorExcludeTranscriptName[];
-extern const char kProjectorExcludeTranscriptDescription[];
-
 extern const char kProjectorLocalPlaybackName[];
 extern const char kProjectorLocalPlaybackDescription[];
 
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
index 77ee182..fcfd64b 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
@@ -32,6 +32,12 @@
              "AccessCodeCastTabSwitchingUI",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Provide functionality to freeze the casting session when AccessCodeCast is
+// enabled.
+BASE_FEATURE(kAccessCodeCastFreezeUI,
+             "AccessCodeCastFreezeUI",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace features
 
 namespace media_router {
@@ -68,6 +74,11 @@
          base::FeatureList::IsEnabled(features::kAccessCodeCastTabSwitchingUI);
 }
 
+bool IsAccessCodeCastFreezeUiEnabled(Profile* profile) {
+  return profile && GetAccessCodeCastEnabledPref(profile) &&
+         base::FeatureList::IsEnabled(features::kAccessCodeCastFreezeUI);
+}
+
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
index b84c5a6b..5d7d9154 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
@@ -18,6 +18,7 @@
 namespace features {
 BASE_DECLARE_FEATURE(kAccessCodeCastRememberDevices);
 BASE_DECLARE_FEATURE(kAccessCodeCastTabSwitchingUI);
+BASE_DECLARE_FEATURE(kAccessCodeCastFreezeUI);
 }
 
 namespace media_router {
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom
index d5d989e..0ced4c2b 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom
@@ -10,4 +10,7 @@
 interface PageHandler {
   // Get the most relevant history cluster.
   GetCluster() => (history_clusters.mojom.Cluster? cluster);
+
+  // Open or make visible the Journeys UI on the Side Panel.
+  ShowJourneysSidePanel(string query);
 };
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
index b8e0e2e..1075ff2e 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/new_tab_page/modules/history_clusters/history_clusters.mojom.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
 #include "components/history_clusters/core/history_cluster_type_utils.h"
 #include "components/history_clusters/core/history_clusters_service.h"
 #include "components/history_clusters/core/history_clusters_service_task.h"
@@ -72,9 +73,10 @@
 HistoryClustersPageHandler::HistoryClustersPageHandler(
     mojo::PendingReceiver<ntp::history_clusters::mojom::PageHandler>
         pending_receiver,
-    Profile* profile)
+    content::WebContents* web_contents)
     : receiver_(this, std::move(pending_receiver)),
-      profile_(profile),
+      profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())),
+      web_contents_(web_contents),
       filter_params_(GetFilterParamsFromFeatureFlags()) {}
 
 HistoryClustersPageHandler::~HistoryClustersPageHandler() = default;
@@ -112,3 +114,10 @@
       base::BindOnce(&HistoryClustersPageHandler::CallbackWithClusterData,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
+
+void HistoryClustersPageHandler::ShowJourneysSidePanel(
+    const std::string& query) {
+  auto* history_clusters_tab_helper =
+      side_panel::HistoryClustersTabHelper::FromWebContents(web_contents_);
+  history_clusters_tab_helper->ShowJourneysSidePanel(query);
+}
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h
index 1ba068e..6c04a2c 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler.h
@@ -19,6 +19,10 @@
 
 class Profile;
 
+namespace content {
+class WebContents;
+}  // namespace content
+
 namespace history_clusters {
 class HistoryClustersServiceTask;
 }  // namespace history_clusters
@@ -29,7 +33,7 @@
   HistoryClustersPageHandler(
       mojo::PendingReceiver<ntp::history_clusters::mojom::PageHandler>
           pending_receiver,
-      Profile* profile);
+      content::WebContents* web_contents);
   HistoryClustersPageHandler(const HistoryClustersPageHandler&) = delete;
   HistoryClustersPageHandler& operator=(const HistoryClustersPageHandler&) =
       delete;
@@ -37,6 +41,7 @@
 
   // mojom::PageHandler:
   void GetCluster(GetClusterCallback callback) override;
+  void ShowJourneysSidePanel(const std::string& query) override;
 
  private:
   // Forward the most relevant history cluster to the callback if any.
@@ -47,6 +52,7 @@
 
   mojo::Receiver<ntp::history_clusters::mojom::PageHandler> receiver_;
   raw_ptr<Profile> profile_;
+  raw_ptr<content::WebContents> web_contents_;
 
   // The filtering parameters to use for all calls to fetch clusters.
   history_clusters::QueryClustersFilterParams filter_params_;
diff --git a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
index 4dda521..428d92df 100644
--- a/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
+++ b/chrome/browser/new_tab_page/modules/history_clusters/history_clusters_page_handler_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/test/mock_callback.h"
 #include "base/time/time.h"
 #include "chrome/browser/history_clusters/history_clusters_service_factory.h"
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/history/core/test/history_service_test_util.h"
 #include "components/history_clusters/core/history_clusters_types.h"
@@ -19,11 +20,33 @@
 #include "components/history_clusters/public/mojom/history_cluster_types.mojom.h"
 #include "components/search/ntp_features.h"
 #include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_web_contents_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
+class MockHistoryClustersTabHelper
+    : public side_panel::HistoryClustersTabHelper {
+ public:
+  static MockHistoryClustersTabHelper* CreateForWebContents(
+      content::WebContents* contents) {
+    DCHECK(contents);
+    DCHECK(!contents->GetUserData(UserDataKey()));
+    contents->SetUserData(
+        UserDataKey(),
+        base::WrapUnique(new MockHistoryClustersTabHelper(contents)));
+    return static_cast<MockHistoryClustersTabHelper*>(
+        contents->GetUserData(UserDataKey()));
+  }
+
+  MOCK_METHOD(void, ShowJourneysSidePanel, (const std::string&), (override));
+
+ private:
+  explicit MockHistoryClustersTabHelper(content::WebContents* web_contents)
+      : HistoryClustersTabHelper(web_contents) {}
+};
+
 std::unique_ptr<TestingProfile> MakeTestingProfile() {
   TestingProfile::Builder profile_builder;
   profile_builder.AddTestingFactory(
@@ -45,15 +68,23 @@
             static_cast<history_clusters::TestHistoryClustersService*>(
                 HistoryClustersServiceFactory::GetForBrowserContext(
                     profile_.get()))),
+        web_contents_(factory_.CreateWebContents(profile_.get())),
+        mock_history_clusters_tab_helper_(
+            MockHistoryClustersTabHelper::CreateForWebContents(
+                web_contents_.get())),
         handler_(std::make_unique<HistoryClustersPageHandler>(
             mojo::PendingReceiver<ntp::history_clusters::mojom::PageHandler>(),
-            profile_.get())) {}
+            web_contents_)) {}
 
   history_clusters::TestHistoryClustersService&
   test_history_clusters_service() {
     return *test_history_clusters_service_;
   }
 
+  MockHistoryClustersTabHelper& mock_history_clusters_tab_helper() {
+    return *mock_history_clusters_tab_helper_;
+  }
+
   HistoryClustersPageHandler& handler() { return *handler_; }
 
  private:
@@ -62,6 +93,9 @@
 
   raw_ptr<history_clusters::TestHistoryClustersService>
       test_history_clusters_service_;
+  content::TestWebContentsFactory factory_;
+  raw_ptr<content::WebContents> web_contents_;  // Weak. Owned by factory_.
+  raw_ptr<MockHistoryClustersTabHelper> mock_history_clusters_tab_helper_;
   std::unique_ptr<HistoryClustersPageHandler> handler_;
 };
 
@@ -162,3 +196,15 @@
   histogram_tester.ExpectUniqueSample(
       "NewTabPage.HistoryClusters.NumClusterCandidates", 0, 1);
 }
+
+TEST_F(HistoryClustersPageHandlerTest, ShowJourneysSidePanel) {
+  std::string kSampleQuery = "safest cars";
+  std::string query;
+  EXPECT_CALL(mock_history_clusters_tab_helper(), ShowJourneysSidePanel)
+      .Times(1)
+      .WillOnce(testing::DoAll(testing::SaveArg<0>(&query)));
+
+  handler().ShowJourneysSidePanel(kSampleQuery);
+
+  EXPECT_EQ(kSampleQuery, query);
+}
diff --git a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
index 5872cb5..30b1e98 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler_unittest.cc
@@ -583,8 +583,7 @@
   file_name += base::NumberToString(file_name_sequence_num_++);
   file_name += ".mht";
   temp_file_path_ = temp_dir_.GetPath().AppendASCII(file_name);
-  ASSERT_NE(base::WriteFile(temp_file_path_, content.c_str(), content.length()),
-            -1);
+  ASSERT_TRUE(base::WriteFile(temp_file_path_, content));
   std::move(callback).Run();
 }
 
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
index 57835fa3..58e3b4d 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
@@ -12,6 +12,7 @@
 #include "base/containers/queue.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
 #include "base/json/json_reader.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
@@ -238,7 +239,8 @@
  public:
   ReportUploader(
       FileUploadJob::Delegate* delegate,
-      scoped_refptr<StorageModuleInterface> storage,
+      base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+          storage_getter,
       bool need_encryption_key,
       std::vector<EncryptedRecord> records,
       ScopedReservation scoped_reservation,
@@ -278,7 +280,8 @@
 
   const raw_ptr<FileUploadJob::Delegate> delegate_;
 
-  const scoped_refptr<StorageModuleInterface> storage_;
+  const base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+      storage_getter_;
 
   bool need_encryption_key_ GUARDED_BY_CONTEXT(sequence_checker_);
   std::vector<EncryptedRecord> records_ GUARDED_BY_CONTEXT(sequence_checker_);
@@ -303,7 +306,8 @@
 
 RecordHandlerImpl::ReportUploader::ReportUploader(
     FileUploadJob::Delegate* delegate,
-    scoped_refptr<StorageModuleInterface> storage,
+    base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+        storage_getter,
     bool need_encryption_key,
     std::vector<EncryptedRecord> records,
     ScopedReservation scoped_reservation,
@@ -313,7 +317,7 @@
     : TaskRunnerContext<CompletionResponse>(std::move(completion_cb),
                                             sequenced_task_runner),
       delegate_(delegate),
-      storage_(storage),
+      storage_getter_(storage_getter),
       need_encryption_key_(need_encryption_key),
       records_(std::move(records)),
       scoped_reservation_(std::move(scoped_reservation)),
@@ -389,7 +393,7 @@
     base::ThreadPool::PostTask(
         FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
         base::BindOnce(&ProcessFileUpload, base::Unretained(delegate_.get()),
-                       storage_, priority, std::move(record_copy),
+                       storage_getter_.Run(), priority, std::move(record_copy),
                        std::move(resume_cb)));
     return;  // We will resume on `resume_cb`
   }
@@ -663,10 +667,11 @@
 RecordHandlerImpl::RecordHandlerImpl(
     scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner,
     std::unique_ptr<FileUploadJob::Delegate> delegate,
-    scoped_refptr<StorageModuleInterface> storage)
+    base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+        storage_getter)
     : sequenced_task_runner_(sequenced_task_runner),
       delegate_(std::move(delegate)),
-      storage_(storage) {}
+      storage_getter_(storage_getter) {}
 
 RecordHandlerImpl::~RecordHandlerImpl() = default;
 
@@ -677,7 +682,7 @@
     CompletionCallback upload_complete_cb,
     EncryptionKeyAttachedCallback encryption_key_attached_cb) {
   Start<RecordHandlerImpl::ReportUploader>(
-      delegate_.get(), storage_, need_encryption_key, std::move(records),
+      delegate_.get(), storage_getter_, need_encryption_key, std::move(records),
       std::move(scoped_reservation), std::move(upload_complete_cb),
       std::move(encryption_key_attached_cb), sequenced_task_runner_);
 }
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
index 7d3e174..5e0eade 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.h
@@ -9,7 +9,9 @@
 #include <utility>
 #include <vector>
 
+#include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/task/sequenced_task_runner.h"
@@ -33,7 +35,8 @@
   RecordHandlerImpl(
       scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner,
       std::unique_ptr<FileUploadJob::Delegate> delegate,
-      scoped_refptr<StorageModuleInterface> storage);
+      base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+          storage_getter);
   ~RecordHandlerImpl() override;
 
   // Base class RecordHandler method implementation.
@@ -52,7 +55,8 @@
 
   // The next two fields are only used for LOG_UPLOAD events.
   const std::unique_ptr<FileUploadJob::Delegate> delegate_;
-  scoped_refptr<StorageModuleInterface> storage_;
+  const base::RepeatingCallback<scoped_refptr<StorageModuleInterface>()>
+      storage_getter_;
 };
 
 }  // namespace reporting
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 8e0d4c4c..ab6bb4e 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
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/base64.h"
+#include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/json/json_writer.h"
 #include "base/memory/scoped_refptr.h"
@@ -29,6 +30,7 @@
 #include "components/reporting/proto/synced/record.pb.h"
 #include "components/reporting/proto/synced/record_constants.pb.h"
 #include "components/reporting/resources/resource_manager.h"
+#include "components/reporting/storage/storage_module_interface.h"
 #include "components/reporting/storage/test_storage_module.h"
 #include "components/reporting/util/status.h"
 #include "components/reporting/util/status_macros.h"
@@ -106,9 +108,14 @@
                                                    /*force_confirm*/ bool>> {
  protected:
   void SetUp() override {
+    storage_ = base::MakeRefCounted<test::TestStorageModule>();
     handler_ = std::make_unique<RecordHandlerImpl>(
         sequenced_task_runner_, std::make_unique<MockFileUploadDelegate>(),
-        base::MakeRefCounted<test::TestStorageModule>());
+        base::BindRepeating(
+            [](scoped_refptr<StorageModuleInterface> storage) {
+              return storage;
+            },
+            storage_));
 
     memory_resource_ =
         base::MakeRefCounted<ResourceManager>(4u * 1024LLu * 1024LLu);  // 4 MiB
@@ -116,6 +123,7 @@
 
   void TearDown() override {
     handler_.reset();
+    storage_.reset();
     EXPECT_THAT(memory_resource_->GetUsed(), Eq(0uL));
   }
 
@@ -129,6 +137,8 @@
 
   ReportingServerConnector::TestEnvironment test_env_;
 
+  scoped_refptr<StorageModuleInterface> storage_;
+
   std::unique_ptr<RecordHandlerImpl> handler_;
 
   scoped_refptr<ResourceManager> memory_resource_;
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 b03cf86..8f37ea2 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
@@ -9,6 +9,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/json/json_writer.h"
 #include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/strcat.h"
@@ -117,11 +118,25 @@
 class RecordHandlerUploadTest : public ::testing::Test {
  protected:
   void SetUp() override {
+    storage_ = base::MakeRefCounted<test::TestStorageModule>();
+    auto delegate = std::make_unique<MockFileUploadDelegate>();
+    delegate_ = delegate.get();
+    handler_ = std::make_unique<RecordHandlerImpl>(
+        sequenced_task_runner_, std::move(delegate),
+        base::BindRepeating(
+            [](scoped_refptr<StorageModuleInterface> storage) {
+              return storage;
+            },
+            storage_));
+
     memory_resource_ =
         base::MakeRefCounted<ResourceManager>(4u * 1024LLu * 1024LLu);  // 4 MiB
   }
 
   void TearDown() override {
+    delegate_ = nullptr;
+    handler_.reset();
+    storage_.reset();
     EXPECT_THAT(memory_resource_->GetUsed(), Eq(0uL));
   }
 
@@ -133,6 +148,12 @@
   FileUploadJob::TestEnvironment manager_test_env_;
   ReportingServerConnector::TestEnvironment test_env_;
 
+  scoped_refptr<test::TestStorageModule> storage_;
+
+  raw_ptr<MockFileUploadDelegate> delegate_;
+
+  std::unique_ptr<RecordHandlerImpl> handler_;
+
   scoped_refptr<ResourceManager> memory_resource_;
 };
 
@@ -243,8 +264,7 @@
   test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
   test::TestEvent<CompletionResponse> responder_event;
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate(StrEq("/tmp/file"), Not(IsEmpty()), _))
+  EXPECT_CALL(*delegate_, DoInitiate(StrEq("/tmp/file"), Not(IsEmpty()), _))
       .WillOnce(Invoke(
           [](base::StringPiece origin_path, base::StringPiece upload_parameters,
              base::OnceCallback<void(
@@ -252,11 +272,10 @@
                                     std::string /*session_token*/>>)> cb) {
             std::move(cb).Run(std::make_pair(300L, "ABC"));
           }));
-  EXPECT_CALL(*delegate, DoNextStep).Times(0);
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .WillOnce(Invoke([](Priority priority, Record record,
                           StorageModuleInterface::EnqueueCallback callback) {
         EXPECT_TRUE(record.needs_local_unencrypted_copy());
@@ -270,12 +289,10 @@
         std::move(callback).Run(Status::StatusOK());
       }));
 
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
-  handler.HandleRecords(/*need_encryption_key=*/false,
-                        std::vector(1, std::move(init_encrypted_record)),
-                        std::move(record_reservation), responder_event.cb(),
-                        encryption_key_attached_event.repeating_cb());
+  handler_->HandleRecords(/*need_encryption_key=*/false,
+                          std::vector(1, std::move(init_encrypted_record)),
+                          std::move(record_reservation), responder_event.cb(),
+                          encryption_key_attached_event.repeating_cb());
   auto response = responder_event.result();
   EXPECT_THAT(response, ResponseEquals(expected_response));
 }
@@ -298,9 +315,8 @@
   test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
   test::TestEvent<CompletionResponse> responder_event;
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
              base::OnceCallback<void(
@@ -309,10 +325,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 100L, std::string(session_token)));
           });
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .WillOnce(Invoke([](Priority priority, Record record,
                           StorageModuleInterface::EnqueueCallback callback) {
         EXPECT_TRUE(record.needs_local_unencrypted_copy());
@@ -325,12 +340,10 @@
         EXPECT_FALSE(log_upload_event.upload_tracker().has_status());
         std::move(callback).Run(Status::StatusOK());
       }));
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
-  handler.HandleRecords(/*need_encryption_key=*/false,
-                        std::vector(1, std::move(next_step_encrypted_record)),
-                        std::move(record_reservation), responder_event.cb(),
-                        encryption_key_attached_event.repeating_cb());
+  handler_->HandleRecords(/*need_encryption_key=*/false,
+                          std::vector(1, std::move(next_step_encrypted_record)),
+                          std::move(record_reservation), responder_event.cb(),
+                          encryption_key_attached_event.repeating_cb());
   auto response = responder_event.result();
   EXPECT_THAT(response, ResponseEquals(expected_response));
 }
@@ -353,10 +366,9 @@
   test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
   test::TestEvent<CompletionResponse> responder_event;
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep).Times(0);
-  EXPECT_CALL(*delegate, DoFinalize(StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize(StrEq("ABC"), _))
       .WillOnce(
           Invoke([](base::StringPiece session_token,
                     base::OnceCallback<void(
@@ -364,8 +376,7 @@
             std::move(cb).Run("http://destination");
           }));
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .WillOnce(Invoke([](Priority priority, Record record,
                           StorageModuleInterface::EnqueueCallback callback) {
         EXPECT_FALSE(record.needs_local_unencrypted_copy());
@@ -378,12 +389,10 @@
         EXPECT_FALSE(log_upload_event.upload_tracker().has_status());
         std::move(callback).Run(Status::StatusOK());
       }));
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
-  handler.HandleRecords(/*need_encryption_key=*/false,
-                        std::vector(1, std::move(fin_encrypted_record)),
-                        std::move(record_reservation), responder_event.cb(),
-                        encryption_key_attached_event.repeating_cb());
+  handler_->HandleRecords(/*need_encryption_key=*/false,
+                          std::vector(1, std::move(fin_encrypted_record)),
+                          std::move(record_reservation), responder_event.cb(),
+                          encryption_key_attached_event.repeating_cb());
   auto response = responder_event.result();
   EXPECT_THAT(response, ResponseEquals(expected_response));
 }
@@ -406,13 +415,11 @@
   test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
   test::TestEvent<CompletionResponse> responder_event;
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep).Times(0);
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .WillOnce(Invoke([](Priority priority, Record record,
                           StorageModuleInterface::EnqueueCallback callback) {
         EXPECT_FALSE(record.needs_local_unencrypted_copy());
@@ -426,12 +433,10 @@
         std::move(callback).Run(Status::StatusOK());
       }));
 
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
-  handler.HandleRecords(/*need_encryption_key=*/false,
-                        std::vector(1, std::move(fin_encrypted_record)),
-                        std::move(record_reservation), responder_event.cb(),
-                        encryption_key_attached_event.repeating_cb());
+  handler_->HandleRecords(/*need_encryption_key=*/false,
+                          std::vector(1, std::move(fin_encrypted_record)),
+                          std::move(record_reservation), responder_event.cb(),
+                          encryption_key_attached_event.repeating_cb());
   auto response = responder_event.result();
   EXPECT_THAT(response, ResponseEquals(expected_response));
 }
@@ -454,9 +459,8 @@
   test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
   test::TestEvent<CompletionResponse> responder_event;
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
              base::OnceCallback<void(
@@ -464,10 +468,9 @@
                                     std::string /*session_token*/>>)> cb) {
             std::move(cb).Run(Status(error::CANCELLED, "Failure by test"));
           });
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .WillOnce(Invoke([](Priority priority, Record record,
                           StorageModuleInterface::EnqueueCallback callback) {
         EXPECT_FALSE(record.needs_local_unencrypted_copy());
@@ -480,12 +483,10 @@
                   MatchError(Status(error::CANCELLED, "Failure by test"))));
         std::move(callback).Run(Status::StatusOK());
       }));
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
-  handler.HandleRecords(/*need_encryption_key=*/false,
-                        std::vector(1, std::move(next_step_encrypted_record)),
-                        std::move(record_reservation), responder_event.cb(),
-                        encryption_key_attached_event.repeating_cb());
+  handler_->HandleRecords(/*need_encryption_key=*/false,
+                          std::vector(1, std::move(next_step_encrypted_record)),
+                          std::move(record_reservation), responder_event.cb(),
+                          encryption_key_attached_event.repeating_cb());
   auto response = responder_event.result();
   EXPECT_THAT(response, ResponseEquals(expected_response));
 }
@@ -505,8 +506,7 @@
       .WillRepeatedly(MakeUploadEncryptedReportAction(
           std::move(ResponseBuilder().SetSuccess(true))));
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate(StrEq("/tmp/file"), Not(IsEmpty()), _))
+  EXPECT_CALL(*delegate_, DoInitiate(StrEq("/tmp/file"), Not(IsEmpty()), _))
       .WillOnce(Invoke(
           [](base::StringPiece origin_path, base::StringPiece upload_parameters,
              base::OnceCallback<void(
@@ -514,11 +514,10 @@
                                     std::string /*session_token*/>>)> cb) {
             std::move(cb).Run(std::make_pair(300L, "ABC"));
           }));
-  EXPECT_CALL(*delegate, DoNextStep).Times(0);
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .Times(kNumTestRecords)
       .WillRepeatedly(
           Invoke([](Priority priority, Record record,
@@ -534,17 +533,15 @@
             std::move(callback).Run(Status::StatusOK());
           }));
 
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
   for (size_t i = 0; i < kNumTestRecords; ++i) {
     ScopedReservation record_reservation(init_encrypted_record.ByteSizeLong(),
                                          memory_resource_);
     test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
     test::TestEvent<CompletionResponse> responder_event;
-    handler.HandleRecords(/*need_encryption_key=*/false,
-                          std::vector(1, init_encrypted_record),
-                          std::move(record_reservation), responder_event.cb(),
-                          encryption_key_attached_event.repeating_cb());
+    handler_->HandleRecords(/*need_encryption_key=*/false,
+                            std::vector(1, init_encrypted_record),
+                            std::move(record_reservation), responder_event.cb(),
+                            encryption_key_attached_event.repeating_cb());
     auto response = responder_event.result();
     EXPECT_THAT(response, ResponseEquals(expected_response));
     init_encrypted_record.mutable_sequence_information()->set_sequencing_id(
@@ -570,9 +567,8 @@
       .WillRepeatedly(MakeUploadEncryptedReportAction(
           std::move(ResponseBuilder().SetSuccess(true))));
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep(Eq(300L), Eq(100L), StrEq("ABC"), _))
       .WillOnce(
           [](int64_t total, int64_t uploaded, base::StringPiece session_token,
              base::OnceCallback<void(
@@ -581,10 +577,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 100L, std::string(session_token)));
           });
-  EXPECT_CALL(*delegate, DoFinalize).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize).Times(0);
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .Times(kNumTestRecords)
       .WillRepeatedly(
           Invoke([](Priority priority, Record record,
@@ -600,17 +595,15 @@
             std::move(callback).Run(Status::StatusOK());
           }));
 
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
   for (size_t i = 0; i < kNumTestRecords; ++i) {
     ScopedReservation record_reservation(
         next_step_encrypted_record.ByteSizeLong(), memory_resource_);
     test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
     test::TestEvent<CompletionResponse> responder_event;
-    handler.HandleRecords(/*need_encryption_key=*/false,
-                          std::vector(1, next_step_encrypted_record),
-                          std::move(record_reservation), responder_event.cb(),
-                          encryption_key_attached_event.repeating_cb());
+    handler_->HandleRecords(/*need_encryption_key=*/false,
+                            std::vector(1, next_step_encrypted_record),
+                            std::move(record_reservation), responder_event.cb(),
+                            encryption_key_attached_event.repeating_cb());
     auto response = responder_event.result();
     EXPECT_THAT(response, ResponseEquals(expected_response));
     next_step_encrypted_record.mutable_sequence_information()
@@ -638,10 +631,9 @@
       .WillRepeatedly(MakeUploadEncryptedReportAction(
           std::move(ResponseBuilder().SetSuccess(true))));
 
-  auto delegate = std::make_unique<MockFileUploadDelegate>();
-  EXPECT_CALL(*delegate, DoInitiate).Times(0);
-  EXPECT_CALL(*delegate, DoNextStep).Times(0);
-  EXPECT_CALL(*delegate, DoFinalize(StrEq("ABC"), _))
+  EXPECT_CALL(*delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(*delegate_, DoNextStep).Times(0);
+  EXPECT_CALL(*delegate_, DoFinalize(StrEq("ABC"), _))
       .WillOnce(
           Invoke([](base::StringPiece session_token,
                     base::OnceCallback<void(
@@ -649,8 +641,7 @@
             std::move(cb).Run("http://destination");
           }));
 
-  auto storage = base::MakeRefCounted<test::TestStorageModule>();
-  EXPECT_CALL(*storage, AddRecord(Eq(Priority::IMMEDIATE), _, _))
+  EXPECT_CALL(*storage_, AddRecord(Eq(Priority::IMMEDIATE), _, _))
       .Times(kNumTestRecords)
       .WillRepeatedly(
           Invoke([](Priority priority, Record record,
@@ -667,17 +658,15 @@
             std::move(callback).Run(Status::StatusOK());
           }));
 
-  RecordHandlerImpl handler(sequenced_task_runner_, std::move(delegate),
-                            storage);
   for (size_t i = 0; i < kNumTestRecords; ++i) {
     ScopedReservation record_reservation(fin_encrypted_record.ByteSizeLong(),
                                          memory_resource_);
     test::TestEvent<SignedEncryptionInfo> encryption_key_attached_event;
     test::TestEvent<CompletionResponse> responder_event;
-    handler.HandleRecords(/*need_encryption_key=*/false,
-                          std::vector(1, fin_encrypted_record),
-                          std::move(record_reservation), responder_event.cb(),
-                          encryption_key_attached_event.repeating_cb());
+    handler_->HandleRecords(/*need_encryption_key=*/false,
+                            std::vector(1, fin_encrypted_record),
+                            std::move(record_reservation), responder_event.cb(),
+                            encryption_key_attached_event.repeating_cb());
     auto response = responder_event.result();
     EXPECT_THAT(response, ResponseEquals(expected_response));
     fin_encrypted_record.mutable_sequence_information()->set_sequencing_id(
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_client.cc b/chrome/browser/policy/messaging_layer/upload/upload_client.cc
index 7b6659f..47fe50d 100644
--- a/chrome/browser/policy/messaging_layer/upload/upload_client.cc
+++ b/chrome/browser/policy/messaging_layer/upload/upload_client.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/policy/messaging_layer/upload/upload_client.h"
 
+#include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chrome/browser/policy/messaging_layer/upload/dm_server_uploader.h"
@@ -51,7 +52,9 @@
       handler_(std::make_unique<RecordHandlerImpl>(
           sequenced_task_runner_,
           std::make_unique<FileUploadDelegate>(),
-          ReportQueueProvider::GetInstance()->storage())) {}
+          base::BindRepeating([]() {
+            return ReportQueueProvider::GetInstance()->storage();
+          }))) {}
 
 UploadClient::~UploadClient() = default;
 
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_client.h b/chrome/browser/policy/messaging_layer/upload/upload_client.h
index dc90550..6b560f1 100644
--- a/chrome/browser/policy/messaging_layer/upload/upload_client.h
+++ b/chrome/browser/policy/messaging_layer/upload/upload_client.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#include "base/task/task_runner.h"
+#include "base/task/sequenced_task_runner.h"
 #include "chrome/browser/policy/messaging_layer/upload/dm_server_uploader.h"
 #include "components/reporting/proto/synced/record.pb.h"
 #include "components/reporting/resources/resource_manager.h"
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_provider.cc b/chrome/browser/policy/messaging_layer/upload/upload_provider.cc
index f23143b..0d7b6d7 100644
--- a/chrome/browser/policy/messaging_layer/upload/upload_provider.cc
+++ b/chrome/browser/policy/messaging_layer/upload/upload_provider.cc
@@ -104,7 +104,8 @@
 
   // Upload client (protected by sequenced task runner). Once set, is used
   // repeatedly.
-  std::unique_ptr<UploadClient> upload_client_;
+  std::unique_ptr<UploadClient> upload_client_
+      GUARDED_BY_CONTEXT(sequenced_task_checker_);
 
   // Keep this last so that all weak pointers will be invalidated at the
   // beginning of destruction.
diff --git a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
index ad57cde..51d3d78 100644
--- a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
+++ b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
@@ -509,9 +509,8 @@
 
 TEST_F(NetworkConfigurationUpdaterAshTest, PolicyIsValidatedAndRepaired) {
   base::Value::Dict onc_repaired =
-      chromeos::onc::test_utils::ReadTestDictionaryValue(
-          "repaired_toplevel_partially_invalid.onc")
-          .TakeDict();
+      chromeos::onc::test_utils::ReadTestDictionary(
+          "repaired_toplevel_partially_invalid.onc");
 
   base::Value::List* network_configs_repaired =
       onc_repaired.FindList(onc::toplevel_config::kNetworkConfigurations);
diff --git a/chrome/browser/policy/test/screenshot_policy_browsertest.cc b/chrome/browser/policy/test/screenshot_policy_browsertest.cc
index 10342ce..b7e2230 100644
--- a/chrome/browser/policy/test/screenshot_policy_browsertest.cc
+++ b/chrome/browser/policy/test/screenshot_policy_browsertest.cc
@@ -47,7 +47,7 @@
 
   // message_center::MessageCenterObserver:
   void OnNotificationAdded(const std::string& notification_id) override {
-    if (notification_id.starts_with(kScreenCaptureNotificationId))
+    if (notification_id == kScreenCaptureNotificationId)
       run_loop_.Quit();
   }
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index ff57c231..9dbc2e5 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -794,6 +794,12 @@
 const char kWebAppsUrlHandlerInfo[] = "web_apps.url_handler_info";
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
+// Deprecated 02/2023.
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+const char kHasSeenSmartLockSignInRemovedNotification[] =
+    "easy_unlock.has_seen_smart_lock_sign_in_removed_notification";
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 // Register local state used only for migration (clearing or moving to a new
 // key).
 void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
@@ -1061,6 +1067,12 @@
                                  base::FilePath());
   registry->RegisterListPref(kPluginsPluginsList);
   registry->RegisterBooleanPref(kPluginsShowDetails, false);
+
+// Deprecated 02/2023.
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  registry->RegisterBooleanPref(kHasSeenSmartLockSignInRemovedNotification,
+                                false);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }
 
 }  // namespace
@@ -2089,6 +2101,11 @@
   profile_prefs->ClearPref(kPluginsPluginsList);
   profile_prefs->ClearPref(kPluginsShowDetails);
 
+// Added 02/2023.
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  profile_prefs->ClearPref(kHasSeenSmartLockSignInRemovedNotification);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_PROFILE_PREFS
 
diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc
index ae4739e..d3151de 100644
--- a/chrome/browser/printing/print_backend_service_manager.cc
+++ b/chrome/browser/printing/print_backend_service_manager.cc
@@ -257,6 +257,35 @@
           base::Unretained(this), std::move(context)));
 }
 
+PrintBackendServiceManager::ContextId
+PrintBackendServiceManager::EstablishPrintingContext(
+    const std::string& printer_name
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+    ,
+    gfx::NativeView parent_view
+#endif
+) {
+  // This call is intended for use with a service that will not be reclaimed
+  // due to an idle timeout.  The client could be used for a system print
+  // dialog and/or for printing a document.  Either `kQueryWithUi` or
+  // `kPrintDocument` would satisfy guaranteeing this persists for as long as
+  // could be needed.  Associate this with the printing document client type,
+  // given that most cases would fall into this usage.
+  CallbackContext context;
+  auto& service = GetServiceAndCallbackContext(
+      printer_name, ClientType::kPrintDocument, context);
+
+  LogCallToRemote("EstablishPrintingContext", context);
+  ContextId context_id = ContextId(++last_context_id_);
+  service->EstablishPrintingContext(*context_id
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+                                    ,
+                                    NativeViewToUint(parent_view)
+#endif
+  );
+  return context_id;
+}
+
 void PrintBackendServiceManager::UseDefaultSettings(
     const std::string& printer_name,
     mojom::PrintBackendService::UseDefaultSettingsCallback callback) {
diff --git a/chrome/browser/printing/print_backend_service_manager.h b/chrome/browser/printing/print_backend_service_manager.h
index 89a1605..05b60020 100644
--- a/chrome/browser/printing/print_backend_service_manager.h
+++ b/chrome/browser/printing/print_backend_service_manager.h
@@ -45,9 +45,38 @@
 
 class PrintBackendServiceManager {
  public:
+  // A RemoteId is used to identify a particular PrintBackendService that
+  // will be servicing queries and printing of a document.  This abstraction
+  // allows for identifying the service desired to be used, without relying
+  // upon a printer name (which sometimes is not available, such as when
+  // doing general queries).
   using RemoteId = base::StrongAlias<class RemoteIdTag, uint32_t>;
+
+  // A ClientId represents a printing action that is being performed by a
+  // browser tab.  There can be different ClientIds depending upon the
+  // action that is being performed:
+  // - During Print Preview, the tab will have a ClientId for the related
+  //   queries.  This ClientId might make use of multiple different RemoteIds,
+  //   depending upon the destinations selected during the preview.
+  // - If a user initiates system print, then a different ClientId is used to
+  //   manage the actions of the system dialog.
+  // - Once it is time to print a document, a different ClientId is used for
+  //   managing the printing sequence.
+  // For system print dialog and document printing, using the same RemoteId
+  // between the two different clients is important to be able to maintain the
+  // same device context in the PrintBackendService.
   using ClientId = base::StrongAlias<class ClientIdTag, uint32_t>;
 
+  // A ContextId is an abstraction of a printing context which resides in the
+  // PrintBackendService.  There can be multiple ContextIds associated with a
+  // RemoteId, since a service could be supporting a system print dialog as
+  // well as multiple documents being printed.  A ContextId is only ever
+  // associated with a single RemoteId.
+  // For system print dialogs, the ContextId used to get the settings will
+  // be shared with another ClientId for printing the document, so that the
+  // same device context settings are used at printing time.
+  using ContextId = base::StrongAlias<class ContextIdTag, uint32_t>;
+
   // Contains set of client IDs.
   using ClientsSet = base::flat_set<ClientId>;
 
@@ -107,6 +136,12 @@
       const std::string& printer_name,
       mojom::PrintBackendService::GetPrinterSemanticCapsAndDefaultsCallback
           callback);
+  ContextId EstablishPrintingContext(const std::string& printer_name
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+                                     ,
+                                     gfx::NativeView parent_view
+#endif
+  );
   void UseDefaultSettings(
       const std::string& printer_name,
       mojom::PrintBackendService::UseDefaultSettingsCallback callback);
@@ -505,10 +540,15 @@
   PrintClientsMap print_document_clients_;
 
   // Simple counter for incrementing ClientId.  All ClientId objects are used
-  // only within the browser process, so need for this to be a more complicated
-  // token.
+  // only within the browser process, so no need for this to be a more
+  // complicated token.
   uint32_t last_client_id_ = 0;
 
+  // Simple counter for incrementing ContextId.  ContextId objects are passed
+  // as parameters to the service but are never provided back, so no need for
+  // this to be a more complicated token.
+  uint32_t last_context_id_ = 0;
+
   // Track the saved callbacks for each remote.
   RemoteSavedEnumeratePrintersCallbacks
       sandboxed_saved_enumerate_printers_callbacks_;
diff --git a/chrome/browser/printing/print_backend_service_test_impl.cc b/chrome/browser/printing/print_backend_service_test_impl.cc
index e4a9162..53df1ab 100644
--- a/chrome/browser/printing/print_backend_service_test_impl.cc
+++ b/chrome/browser/printing/print_backend_service_test_impl.cc
@@ -70,7 +70,10 @@
     : PrintBackendServiceImpl(std::move(receiver)),
       test_print_backend_(std::move(backend)) {}
 
-PrintBackendServiceTestImpl::~PrintBackendServiceTestImpl() = default;
+PrintBackendServiceTestImpl::~PrintBackendServiceTestImpl() {
+  // Make sure that all persistent contexts have been properly cleaned up.
+  DCHECK(persistent_printing_contexts_.empty());
+}
 
 void PrintBackendServiceTestImpl::Init(
 #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index ad159b8..95c06f1 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/translate/chrome_translate_client.h"
+#include "chrome/browser/ui/autofill/chrome_autofill_client.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/common/pref_names.h"
@@ -38,9 +39,9 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h"
+#include "components/autofill/content/browser/test_content_autofill_client.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
-#include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/custom_handlers/protocol_handler_registry.h"
@@ -1023,12 +1024,17 @@
 
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
-    autofill_client_ = std::make_unique<autofill::TestAutofillClient>(
+    auto autofill_client =
+        std::make_unique<autofill::TestContentAutofillClient>(web_contents());
+    autofill_client->set_personal_data_manager(
         std::make_unique<autofill::TestPersonalDataManager>());
+    autofill_client_ = autofill_client.get();
+    web_contents()->SetUserData(autofill_client_->UserDataKey(),
+                                std::move(autofill_client));
   }
 
   void TearDown() override {
-    autofill_client_.reset();
+    web_contents()->RemoveUserData(autofill_client_->UserDataKey());
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
@@ -1039,18 +1045,14 @@
   void InjectAutofillDriver(
       content::RenderFrameHost* rfh,
       std::unique_ptr<autofill::TestAutofillDriver> driver) {
-    autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-        web_contents(), autofill_client_.get(),
-        autofill::ContentAutofillDriverFactory::DriverInitCallback());
-    auto* cadf =
-        autofill::ContentAutofillDriverFactory::FromWebContents(web_contents());
-    autofill::ContentAutofillDriverFactoryTestApi(cadf).SetDriver(
-        rfh, std::move(driver));
+    autofill::ContentAutofillDriverFactoryTestApi(
+        autofill_client_->GetAutofillDriverFactory())
+        .SetDriver(rfh, std::move(driver));
   }
 
  private:
-  std::unique_ptr<autofill::TestAutofillClient> autofill_client_;
   base::test::ScopedFeatureList feature_list_;
+  raw_ptr<autofill::TestContentAutofillClient> autofill_client_;
 };
 
 INSTANTIATE_TEST_SUITE_P(AutofillContextMenuTest,
diff --git a/chrome/browser/resources/access_code_cast/BUILD.gn b/chrome/browser/resources/access_code_cast/BUILD.gn
index 479a3a7..d2ca20a2 100644
--- a/chrome/browser/resources/access_code_cast/BUILD.gn
+++ b/chrome/browser/resources/access_code_cast/BUILD.gn
@@ -33,6 +33,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/app_home/BUILD.gn b/chrome/browser/resources/app_home/BUILD.gn
index abc9842..5301f3c 100644
--- a/chrome/browser/resources/app_home/BUILD.gn
+++ b/chrome/browser/resources/app_home/BUILD.gn
@@ -37,7 +37,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 }
diff --git a/chrome/browser/resources/app_service_internals/BUILD.gn b/chrome/browser/resources/app_service_internals/BUILD.gn
index d4ab209..427e5bb 100644
--- a/chrome/browser/resources/app_service_internals/BUILD.gn
+++ b/chrome/browser/resources/app_service_internals/BUILD.gn
@@ -16,6 +16,6 @@
 
   ts_deps = [
     "//third_party/polymer/v3_0:library",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/bluetooth_internals/BUILD.gn b/chrome/browser/resources/bluetooth_internals/BUILD.gn
index ffd6cbb4..49ce445 100644
--- a/chrome/browser/resources/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/resources/bluetooth_internals/BUILD.gn
@@ -99,7 +99,7 @@
   in_files = js_files + html_wrapper_files + mojom_files
   deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_files",
diff --git a/chrome/browser/resources/browsing_topics/BUILD.gn b/chrome/browser/resources/browsing_topics/BUILD.gn
index 9b198e0b..4f6dd02 100644
--- a/chrome/browser/resources/browsing_topics/BUILD.gn
+++ b/chrome/browser/resources/browsing_topics/BUILD.gn
@@ -19,7 +19,7 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js
index 3147b21c5..e3aa7082 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/composite_tts.js
@@ -73,38 +73,26 @@
         engine => engine.removeCapturingEventListener(listener));
   }
 
-  /**
-   * @override
-   */
+  /** @override */
   increaseOrDecreaseProperty(propertyName, increase) {
     this.ttsEngines_.forEach(
         engine => engine.increaseOrDecreaseProperty(propertyName, increase));
   }
 
-  /**
-   * @override
-   */
+  /** @override */
   propertyToPercentage(property) {
-    for (let i = 0, engine; engine = this.ttsEngines_[i]; i++) {
-      const value = engine.propertyToPercentage(property);
-      if (value !== undefined) {
-        return value;
-      }
-    }
-    return null;
+    const percentages =
+        this.ttsEngines_.map(engine => engine.propertyToPercentage(property));
+    // Return the first non-null percent, or null if all values are null.
+    return percentages.find(percent => percent !== undefined) ?? null;
   }
 
-  /**
-   * @override
-   */
+  /** @override */
   getDefaultProperty(property) {
-    for (let i = 0, engine; engine = this.ttsEngines_[i]; i++) {
-      const value = engine.getDefaultProperty(property);
-      if (value !== undefined) {
-        return value;
-      }
-    }
-    return null;
+    const defaultValues =
+        this.ttsEngines_.map(engine => engine.getDefaultProperty(property));
+    // Return the first non-null value, or null if all values are null.
+    return defaultValues.find(value => value !== null) ?? null;
   }
 
   /** @override */
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/injected_script_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/injected_script_loader.js
index afda2c47..a04ef6e1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/injected_script_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/injected_script_loader.js
@@ -8,13 +8,35 @@
 
 export class InjectedScriptLoader {
   /**
+   * Inject the content scripts into already existing tabs.
+   * @param {!Array<!Tab>} tabs The tab where ChromeVox scripts should be
+   *     injected.
+   */
+  static async injectContentScript(tabs) {
+    const listOfFiles =
+        chrome.runtime.getManifest()['content_scripts'][0]['js'];
+
+    const loader = new InjectedScriptLoader();
+    const code =
+        await new Promise(resolve => loader.fetchCode_(listOfFiles, resolve));
+    for (const tab of tabs) {
+      // Set a variable so that Closure deps work correctly.
+      loader.execute_('window.CLOSURE_NO_DEPS = true', tab);
+
+      // Now inject the ChromeVox content script code into the tab.
+      listOfFiles.forEach(file => loader.execute_(code[file], tab));
+    }
+  }
+
+  /**
    * Loads a dictionary of file contents for Javascript files.
    * @param {Array<string>} files A list of file names.
    * @param {function(Object<string,string>)} done A function called when all
    *     the files have been loaded. Called with the code map as the first
    *     parameter.
+   * @private
    */
-  static fetchCode(files, done) {
+  fetchCode_(files, done) {
     const code = {};
     let waiting = files.length;
     const startTime = new Date();
@@ -50,33 +72,12 @@
   }
 
   /**
-   * Inject the content scripts into already existing tabs.
-   * @param {!Array<!Tab>} tabs The tab where ChromeVox scripts should be
-   *     injected.
-   */
-  static async injectContentScript(tabs) {
-    const listOfFiles =
-        chrome.runtime.getManifest()['content_scripts'][0]['js'];
-
-    const code = await new Promise(
-        resolve => InjectedScriptLoader.fetchCode(listOfFiles, resolve));
-    for (const tab of tabs) {
-      // Set a variable so that Closure deps work correctly.
-      InjectedScriptLoader.execute_('window.CLOSURE_NO_DEPS = true', tab);
-
-      // Now inject the ChromeVox content script code into the tab.
-      listOfFiles.forEach(
-          file => InjectedScriptLoader.execute_(code[file], tab));
-    }
-  }
-
-  /**
    * A helper function which executes code.
    * @param {string} code The code to execute.
    * @return {!Promise}
    * @private
    */
-  static async execute_(code, tab) {
+  async execute_(code, tab) {
     await new Promise(
         resolve => chrome.tabs.executeScript(
             tab.id, {code, 'allFrames': true}, resolve));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js
index a9c40b5a..57a2b56f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/command_store.js
@@ -291,12 +291,12 @@
 };
 
 /**
- * Collection of command properties.
- * @type {Object<!Command, {
- *                  announce: boolean,
- *                  category: (undefined|!CommandCategory),
- *                  msgId: (undefined|string),
- *                  denySignedOut: (undefined|boolean)}>}
+ * @typedef {{
+ *     announce: boolean,
+ *     category: (undefined|!CommandCategory),
+ *     msgId: (undefined|string),
+ *     denySignedOut: (undefined|boolean)
+ * }}
  *  announce: Whether to call finishNavCommand and announce the current
  *            position after the command is done.
  *  category: The command's category.
@@ -304,6 +304,12 @@
  *  denySignedOut: Explicitly denies this command when on chrome://oobe/* or
  *             other signed-out contexts. Defaults to false.
  */
+let DataEntry;
+
+/**
+ * Collection of command properties.
+ * @type {Object<!Command, !DataEntry>}
+ */
 CommandStore.COMMAND_DATA = {
   [Command.TOGGLE_STICKY_MODE]: {
     announce: false,
diff --git a/chrome/browser/resources/chromeos/accessibility/definitions/automation.d.ts b/chrome/browser/resources/chromeos/accessibility/definitions/automation.d.ts
new file mode 100644
index 0000000..1904a94
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/definitions/automation.d.ts
@@ -0,0 +1,948 @@
+// 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.
+
+/** @fileoverview Definitions for chrome.automation API. */
+// TODO(crbug.com/1203307): Auto-generate this file.
+
+declare namespace chrome {
+  export namespace automation {
+    export enum EventType {
+      ACCESS_KEY_CHANGED = 'accessKeyChanged',
+      ACTIVE_DESCENDANT_CHANGED = 'activeDescendantChanged',
+      ALERT = 'alert',
+      ARIA_ATTRIBUTE_CHANGED = 'ariaAttributeChanged',
+      ARIA_CURRENT_CHANGED = 'ariaCurrentChanged',
+      ATOMIC_CHANGED = 'atomicChanged',
+      AUTO_COMPLETE_CHANGED = 'autoCompleteChanged',
+      AUTOCORRECTION_OCCURED = 'autocorrectionOccured',
+      AUTOFILL_AVAILABILITY_CHANGED = 'autofillAvailabilityChanged',
+      BLUR = 'blur',
+      BUSY_CHANGED = 'busyChanged',
+      CARET_BOUNDS_CHANGED = 'caretBoundsChanged',
+      CHECKED_STATE_CHANGED = 'checkedStateChanged',
+      CHECKED_STATE_DESCRIPTION_CHANGED = 'checkedStateDescriptionChanged',
+      CHILDREN_CHANGED = 'childrenChanged',
+      CLASS_NAME_CHANGED = 'classNameChanged',
+      CLICKED = 'clicked',
+      COLLAPSED = 'collapsed',
+      CONTROLS_CHANGED = 'controlsChanged',
+      DETAILS_CHANGED = 'detailsChanged',
+      DESCRIBED_BY_CHANGED = 'describedByChanged',
+      DESCRIPTION_CHANGED = 'descriptionChanged',
+      DOCUMENT_SELECTION_CHANGED = 'documentSelectionChanged',
+      DOCUMENT_TITLE_CHANGED = 'documentTitleChanged',
+      DROPEFFECT_CHANGED = 'dropeffectChanged',
+      EDITABLE_TEXT_CHANGED = 'editableTextChanged',
+      ENABLED_CHANGED = 'enabledChanged',
+      END_OF_TEST = 'endOfTest',
+      EXPANDED = 'expanded',
+      EXPANDED_CHANGED = 'expandedChanged',
+      FLOW_FROM_CHANGED = 'flowFromChanged',
+      FLOW_TO_CHANGED = 'flowToChanged',
+      FOCUS = 'focus',
+      FOCUS_AFTER_MENU_CLOSE = 'focusAfterMenuClose',
+      FOCUS_CHANGED = 'focusChanged',
+      FOCUS_CONTEXT = 'focusContext',
+      GRABBED_CHANGED = 'grabbedChanged',
+      HASPOPUP_CHANGED = 'haspopupChanged',
+      HIDE = 'hide',
+      HIERARCHICAL_LEVEL_CHANGED = 'hierarchicalLevelChanged',
+      HIT_TEST_RESULT = 'hitTestResult',
+      HOVER = 'hover',
+      IGNORED_CHANGED = 'ignoredChanged',
+      IMAGE_ANNOTATION_CHANGED = 'imageAnnotationChanged',
+      IMAGE_FRAME_UPDATED = 'imageFrameUpdated',
+      INVALID_STATUS_CHANGED = 'invalidStatusChanged',
+      KEY_SHORTCUTS_CHANGED = 'keyShortcutsChanged',
+      LABELED_BY_CHANGED = 'labeledByChanged',
+      LANGUAGE_CHANGED = 'languageChanged',
+      LAYOUT_COMPLETE = 'layoutComplete',
+      LAYOUT_INVALIDATED = 'layoutInvalidated',
+      LIVE_REGION_CHANGED = 'liveRegionChanged',
+      LIVE_REGION_CREATED = 'liveRegionCreated',
+      LIVE_REGION_NODE_CHANGED = 'liveRegionNodeChanged',
+      LIVE_RELEVANT_CHANGED = 'liveRelevantChanged',
+      LIVE_STATUS_CHANGED = 'liveStatusChanged',
+      LOAD_COMPLETE = 'loadComplete',
+      LOAD_START = 'loadStart',
+      LOCATION_CHANGED = 'locationChanged',
+      MEDIA_STARTED_PLAYING = 'mediaStartedPlaying',
+      MEDIA_STOPPED_PLAYING = 'mediaStoppedPlaying',
+      MENU_END = 'menuEnd',
+      MENU_ITEM_SELECTED = 'menuItemSelected',
+      MENU_LIST_VALUE_CHANGED = 'menuListValueChanged',
+      MENU_POPUP_END = 'menuPopupEnd',
+      MENU_POPUP_START = 'menuPopupStart',
+      MENU_START = 'menuStart',
+      MOUSE_CANCELED = 'mouseCanceled',
+      MOUSE_DRAGGED = 'mouseDragged',
+      MOUSE_MOVED = 'mouseMoved',
+      MOUSE_PRESSED = 'mousePressed',
+      MOUSE_RELEASED = 'mouseReleased',
+      MULTILINE_STATE_CHANGED = 'multilineStateChanged',
+      MULTISELECTABLE_STATE_CHANGED = 'multiselectableStateChanged',
+      NAME_CHANGED = 'nameChanged',
+      OBJECT_ATTRIBUTE_CHANGED = 'objectAttributeChanged',
+      OTHER_ATTRIBUTE_CHANGED = 'otherAttributeChanged',
+      PARENT_CHANGED = 'parentChanged',
+      PLACEHOLDER_CHANGED = 'placeholderChanged',
+      PORTAL_ACTIVATED = 'portalActivated',
+      POSITION_IN_SET = 'positionInSet',
+      RANGE_VALUE_CHANGED = 'rangeValueChanged',
+      RANGE_VALUE_MAX_CHANGED = 'rangeValueMaxChanged',
+      RANGE_VALUE_MIN_CHANGED = 'rangeValueMinChanged',
+      RANGE_VALUE_STEP_CHANGED = 'rangeValueStepChanged',
+      READONLY_CHANGED = 'readonlyChanged',
+      RELATED_NODE_CHANGED = 'relatedNodeChanged',
+      REQUIRED_STATE_CHANGED = 'requiredStateChanged',
+      ROLE_CHANGED = 'roleChanged',
+      ROW_COLLAPSED = 'rowCollapsed',
+      ROW_COUNT_CHANGED = 'rowCountChanged',
+      ROW_EXPANDED = 'rowExpanded',
+      SCROLL_HORIZONTAL_POSITION_CHANGED = 'scrollHorizontalPositionChanged',
+      SCROLL_POSITION_CHANGED = 'scrollPositionChanged',
+      SCROLL_VERTICAL_POSITION_CHANGED = 'scrollVerticalPositionChanged',
+      SCOLLED_TO_ANCHOR = 'scrollToAnchor',
+      SELECTED_CHANGED = 'selectedChanged',
+      SELECTED_CHILDREN_CHANGED = 'selectedChildrenChanged',
+      SELECTED_VALUE_CHANGED = 'selectedValueChanged',
+      SELECTION = 'selection',
+      SELECTION_ADD = 'selectionAdd',
+      SELECTION_REMOVE = 'selectionRemove',
+      SET_SIZE_CHANGED = 'setSizeChange',
+      SHOW = 'show',
+      SORT_CHANGED = 'sortChanged',
+      STATE_CHANGED = 'stateChanged',
+      SUBTREE_CHANGED = 'subtreeChanged',
+      TEXT_ATTRIBUTE_CHANGED = 'textAttributeChanged',
+      TEXT_SELECTION_CHANGED = 'textSelectionChanged',
+      TEXT_CHANGED = 'textChanged',
+      TOOLTIP_CLOSED = 'tooltipClosed',
+      TOOLTIP_OPENED = 'tooltipOpened',
+      TREE_CHANGED = 'treeChanged',
+      VALUE_IN_TEXT_FIELD_CHANGED = 'valueInTextFieldChanged',
+      VALUE_CHANGED = 'valueChanged',
+      WINDOW_ACTIVATED = 'windowActivated',
+      WINDOW_DEACTIVATED = 'windowDeactivated',
+      WINDOW_VISIBILITY_CHANGED = 'windowVisibilityChanged'
+    }
+
+    export enum RoleType {
+      ABBR = 'abbr',
+      ALERT = 'alert',
+      ALERT_DIALOG = 'alertDialog',
+      APPLICATION = 'application',
+      ARTICLE = 'article',
+      AUDIO = 'audio',
+      BANNER = 'banner',
+      BLOCKQUOTE = 'blockquote',
+      BUTTON = 'button',
+      CANVAS = 'canvas',
+      CAPTION = 'caption',
+      CARET = 'caret',
+      CELL = 'cell',
+      CHECK_BOX = 'checkBox',
+      CLIENT = 'client',
+      CODE = 'code',
+      COLOR_WELL = 'colorWell',
+      COLUMN = 'column',
+      COLUMN_HEADER = 'columnHeader',
+      COMBO_BOX_GROUPING = 'comboBoxGrouping',
+      COMBO_BOX_MENU_BUTTON = 'comboBoxMenuButton',
+      COMBO_BOX_SELECT = 'comboBoxSelect',
+      COMMENT = 'comment',
+      COMPLEMENTARY = 'complementary',
+      CONTENT_DELETION = 'contentDeletion',
+      CONTENT_INSERTION = 'contentInsertion',
+      CONTENT_INFO = 'contentInfo',
+      DATE = 'date',
+      DATE_TIME = 'dateTime',
+      DEFINITION = 'definition',
+      DESCRIPTION_LIST = 'descriptionList',
+      DESCRIPTION_LIST_DETAIL = 'descriptionListDetail',
+      DESCRIPTION_LIST_TERM = 'descriptionListTerm',
+      DESKTOP = 'desktop',
+      DETAILS = 'details',
+      DIALOG = 'dialog',
+      DIRECTORY = 'directory',
+      DISCLOSURE_TRIANGLE = 'disclosure_triangle',
+      DOC_ABSTRACT = 'docAbstract',
+      DOC_ACKNOWLEDGEMENTS = 'docAcknowledgements',
+      DOC_AFTERWARD = 'docAfterward',
+      DOC_APPENDIX = 'docAppendix',
+      DOC_BACK_LINK = 'docBackLink',
+      DOC_BIBLIO_ENTRY = 'docBiblioEntry',
+      DOC_BIBLIOGRAPHY = 'docBibliography',
+      DOC_BIBLIO_REF = 'docBiblioRef',
+      DOC_CHAPTER = 'docChapter',
+      DOC_COLOPHON = 'docColophon',
+      DOC_CONCLUSION = 'docConclusion',
+      DOC_COVER = 'docCover',
+      DOC_CREDIT = 'docCredit',
+      DOC_CREDITS = 'docCredits',
+      DOC_DEDICATION = 'docDedication',
+      DOC_ENDNOTE = 'docEndnote',
+      DOC_ENDNOTES = 'docEndnotes',
+      DOC_EPIGRAPH = 'docEpigraph',
+      DOC_EPILOGUE = 'docEpilogue',
+      DOC_ERRATA = 'docErrata',
+      DOC_EXAMPLE = 'docExample',
+      DOC_FOOTNOTE = 'docFootnote',
+      DOC_FOREWORD = 'docForeword',
+      DOC_GLOSSARY = 'docGlossary',
+      DOC_GLOSS_REF = 'docGlossRef',
+      DOC_INDEX = 'docIndex',
+      DOC_INTRODUCTION = 'docIntroduction',
+      DOC_NOTE_REF = 'docNoteRef',
+      DOC_NOTICE = 'docNotice',
+      DOC_PAGE_BREAK = 'docPageBreak',
+      DOC_PAGE_FOOTER = 'docPageFooter',
+      DOC_PAGE_HEADER = 'docPageHeader',
+      DOC_PAGE_LIST = 'docPageList',
+      DOC_PART = 'docPart',
+      DOC_PREFACE = 'docPreface',
+      DOC_PROLOGUE = 'docPrologue',
+      DOC_PULLQUOTE = 'docPullquote',
+      DOC_QNA = 'docQuna',
+      DOC_SUBTITLE = 'docSubtitle',
+      DOC_TIP = 'docTip',
+      DOC_TOC = 'docToc',
+      DOCUMENT = 'document',
+      EMBEDDED_DOCUMENT = 'embeddedDocument',
+      EMPHASIS = 'emphasis',
+      FEED = 'feed',
+      FIGCAPTION = 'figcaption',
+      FIGURE = 'figure',
+      FOOTER = 'footer',
+      FOTTER_AS_NON_LANDMARK = 'footerAsNonLandmark',
+      FORM = 'form',
+      GENERIC_CONTAINER = 'genericContainer',
+      GRAPHICS_DOCUMENT = 'graphicsDocument',
+      GRAPHICS_OBJECT = 'graphicsObject',
+      GRAPHICS_SYMBOL = 'graphicsSymbol',
+      GRID = 'grid',
+      GROUP = 'group',
+      HEADER = 'header',
+      HEADER_AS_NON_LANDMARK = 'headerAsNonLandmark',
+      HEADING = 'heading',
+      IFRAME = 'iframe',
+      IFRAME_PRESENTATIONAL = 'iframePresentational',
+      IMAGE = 'image',
+      IME_CANDIDATE = 'imeCandidate',
+      INLINE_TEXT_BOX = 'inlineTextBox',
+      INPUT_TIME = 'inputTime',
+      KEYBOARD = 'keyboard',
+      LABEL_TEXT = 'labelText',
+      LAYOUT_TABLE = 'layoutTable',
+      LAYOUT_TABLE_CELL = 'layoutTableCell',
+      LAYOUT_TABLE_ROW = 'layoutTableRow',
+      LEGEND = 'legend',
+      LINE_BREAK = 'lineBreak',
+      LINK = 'link',
+      LIST = 'list',
+      LIST_BOX = 'listBox',
+      LIST_BOX_OPTION = 'listBoxOption',
+      LIST_GRID = 'listGrid',
+      LIST_ITEM = 'listItem',
+      LIST_MARKER = 'listMarker',
+      LOG = 'log',
+      MAIN = 'main',
+      MARK = 'mark',
+      MARQUEE = 'marquee',
+      MATH = 'math',
+      MATH_ML_FRACTION = 'mathMLFraction',
+      MATH_ML_IDENTIFIER = 'mathMLIdentifier',
+      MATH_ML_MATH = 'mathMLMath',
+      MATH_ML_MULTISCRIPTS = 'mathMLMultiscripts',
+      MATH_ML_NONE_SCRIPT = 'mathMLNoneScript',
+      MATH_ML_NUMBER = 'mathMLNumber',
+      MATH_ML_OPERATOR = 'mathMLOperator',
+      MATH_ML_OVER = 'mathMLOver',
+      MATH_ML_PRESCRIPT_DELIMITER = 'mathMLPrescriptDelimiter',
+      MATH_ML_ROOT = 'mathMLRoot',
+      MATH_ML_ROW = 'mathMLRow',
+      MATH_ML_SQUARE_ROOT = 'mathMLSquareRoot',
+      MATH_ML_STRING_LITERAL = 'mathMLStringLiteral',
+      MATH_ML_SUB = 'mathMLSub',
+      MATH_ML_SUB_SUP = 'mathMLSubSup',
+      MATH_ML_SUP = 'mathMLSup',
+      MATH_ML_TABLE = 'mathMLTable',
+      MATH_ML_TABLE_CELL = 'mathMLTableCell',
+      MATH_ML_TABLE_ROW = 'mathMLTableRow',
+      MATH_ML_TEXT = 'mathMLText',
+      MATH_ML_UNDER = 'mathMLUnder',
+      MATH_ML_UNDER_OVER = 'mathMLUnderOver',
+      MENU = 'menu',
+      MENU_BAR = 'menuBar',
+      MENU_ITEM = 'menuItem',
+      MENU_ITEM_CHECK_BOX = 'menuItemCheckBox',
+      MENU_ITEM_RADIO = 'menuItemRadio',
+      MENU_LIST_OPTION = 'menuListOption',
+      MENU_LIST_POPUP = 'menuListPopup',
+      METER = 'meter',
+      NAVIGATION = 'navigation',
+      NOTE = 'note',
+      PANE = 'pane',
+      PARAGRAPH = 'paragraph',
+      PDF_ACTIONABLE_HIGHLIGHT = 'pdfActionableHighlight',
+      PDF_ROOT = 'pdfRoot',
+      PLUGIN_OBJECT = 'pluginObject',
+      POP_UP_BUTTON = 'popUpButton',
+      PORTAL = 'portal',
+      PRE = 'pre',
+      PROGRESS_INDICATOR = 'progressIndicator',
+      RADIO_BUTTON = 'radioButton',
+      RADIO_GROUP = 'radioGroup',
+      REGION = 'region',
+      ROOT_WEB_AREA = 'rootWebArea',
+      ROW = 'row',
+      ROW_GROUP = 'rowGroup',
+      ROW_HEADER = 'rowHeader',
+      RUBY = 'ruby',
+      RUBY_ANNOTATION = 'rubyAnnotation',
+      SCROLL_BAR = 'scrollBar',
+      SCROLL_VIEW = 'scrollView',
+      SEARCH = 'search',
+      SEARCH_BOX = 'searchBox',
+      SECTION = 'section',
+      SLIDER = 'slider',
+      SPIN_BUTTON = 'spinButton',
+      SPLITTER = 'splitter',
+      STATIC_TEXT = 'staticText',
+      STATUS = 'status',
+      STRONG = 'strong',
+      SUBSCRIPT = 'subscript',
+      SUGGESTION = 'suggestion',
+      SUPERSCRIPT = 'superscript',
+      SVG_ROOT = 'svgRoot',
+      SWITCH = 'switch',
+      TAB = 'tab',
+      TAB_LIST = 'tabList',
+      TAB_PANEL = 'tabPanel',
+      TABLE = 'table',
+      TABLE_HEADER_CONTAINER = 'tableHeaderContainer',
+      TERM = 'term',
+      TEXT_FIELD = 'textField',
+      TEXT_FIELD_WITH_COMBO_BOX = 'textFieldWithComboBox',
+      TIME = 'time',
+      TIMER = 'timer',
+      TITLE_BAR = 'titleBar',
+      TOGGLE_BUTTON = 'toggleButton',
+      TOOLBAR = 'toolbar',
+      TOOLTIP = 'tooltip',
+      TREE = 'tree',
+      TREE_GRID = 'treeGrid',
+      TREE_ITEM = 'treeItem',
+      UNKNOWN = 'unknown',
+      VIDEO = 'video',
+      WEB_VIEW = 'webView',
+      WINDOW = 'window',
+    }
+
+    export enum StateType {
+      AUTOFILL_AVAILABLE = 'autofillAvailable',
+      COLLAPSED = 'collapsed',
+      DEFAULT = 'default',
+      EDITABLE = 'editable',
+      EXPANDED = 'expanded',
+      FOCUSABLE = 'focusable',
+      FOCUSED = 'focused',
+      HORIZONTAL = 'horizontal',
+      HOVERED = 'hovered',
+      IGNORED = 'ignored',
+      INVISIBLE = 'invisible',
+      LINKED = 'linked',
+      MULTILINE = 'multiline',
+      MULTISELECTABLE = 'multiselectable',
+      OFFSCREEN = 'offscreen',
+      PROTECTED = 'protected',
+      REQUIRED = 'required',
+      RICHLY_EDITABLE = 'richlyEditable',
+      VERTICAL = 'vertical',
+      VISITED = 'visited',
+    }
+
+    export enum ActionType {
+      ANNOTATE_PAGE_IMAGES = 'annotatePageImages',
+      BLUR = 'blur',
+      CLEAR_ACCESSIBILITY_FOCUS = 'clearAccessibilityFocus',
+      COLLAPSE = 'collapse',
+      CUSTOM_ACTION = 'customAction',
+      DECREMENT = 'decrement',
+      DO_DEFAULT = 'doDefault',
+      EXPAND = 'expand',
+      FOCUS = 'focus',
+      GET_IMAGE_DATA = 'getImageData',
+      GET_TEXT_LOCATION = 'getTextLocation',
+      HIDE_TOOLTIP = 'hideTooltip',
+      HIT_TEST = 'hitTest',
+      INCREMENT = 'increment',
+      INTERNAL_INVALIDATE_TREE = 'internalInvalidateTree',
+      LOAD_INLINE_TEXT_BOXES = 'loadInlineTextBoxes',
+      LONG_CLICK = 'longClick',
+      REPLACE_SELECTED_TEXT = 'replaceSelectedText',
+      RESUME_MEDIA = 'resumeMedia',
+      SCROLL_BACKWARD = 'scrollBackward',
+      SCROLL_DOWN = 'scrollDown',
+      SCROLL_FORWARD = 'scrollForward',
+      SCROLL_LEFT = 'scrollLeft',
+      SCROLL_RIGHT = 'scrollRight',
+      SCROLL_UP = 'scrollUp',
+      SCROLL_TO_MAKE_VISIBLE = 'scrollToMakeVisible',
+      SCROLL_TO_POINT = 'scrollToPoint',
+      SCROLL_TO_POSITION_AT_ROW_COLUMN = 'scrollToPositionAtRowColumn',
+      SET_ACCESSIBILITY_FOCUS = 'setAccessibilityFocus',
+      SET_SCROLL_OFFSET = 'setSCrollOffset',
+      SET_SELECTION = 'setSelection',
+      SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT =
+          'setSequentialFocusNavigationStartingPoint',
+      SET_VALUE = 'setValue',
+      SHOW_CONTEXT_MENU = 'showContextMenu',
+      SIGNAL_END_OF_TEST = 'signalEndOfTest',
+      SHOW_TOOLTIP = 'showTooltip',
+      START_DUCKING_MEDIA = 'startDuckingMedia',
+      STOP_DUCKING_MEDIA = 'stopDuckingMedia',
+      SUSPEND_MEDIA = 'suspendMedia',
+    }
+
+    export enum TreeChangeType {
+      NODE_CHANGED = 'nodeChanged',
+      NODE_CREATED = 'nodeCreated',
+      NODE_REMOVED = 'nodeRemoved',
+      SUBTREE_CREATED = 'subtreeCreated',
+      SUBTREE_UPDATE_END = 'subtreeUpdateEnd',
+      TEXT_CHANGED = 'textChanged',
+    }
+
+    export enum NameFromType {
+      ATTRIBUTE = 'attribute',
+      ATTRIBUTE_EXPLICITLY_EMPTY = 'attributeExplicitlyEmpty',
+      CAPTION = 'caption',
+      CONTENTS = 'contents',
+      PLACEHOLDER = 'placeholder',
+      RELATED_ELEMENT = 'relatedElement',
+      TITLE = 'title',
+      VALUE = 'value',
+    }
+
+    export enum DescriptionFromType {
+      ARIA_DESCRIPTION = 'ariaDescription',
+      ATTRIBUTE_EXPLICITLY_EMPTY = 'attributeExplicitlyEmpty',
+      BUTTON_LABEL = 'buttonLabel',
+      POPOVER_ATTRIBUTE = 'popoverAttribute',
+      RELATED_ELEMENT = 'relatedElement',
+      RUBY_ANNOTATION = 'rubyAnnotation',
+      SUMMARY = 'summary',
+      SVG_DESC_ELEMENT = 'svgDescElement',
+      TABLE_CAPTION = 'tableCaption',
+      TITLE = 'title',
+    }
+
+    export enum Restriction {
+      DISABLED = 'disabled',
+      READ_ONLY = 'readOnly',
+    }
+
+    export enum HasPopup {
+      DIALOG = 'dialog',
+      FALSE = 'false',
+      GRID = 'grid',
+      LISTBOX = 'listbox',
+      MENU = 'menu',
+      TREE = 'tree',
+      TRUE = 'true',
+    }
+
+    export enum AriaCurrentState {
+      DATE = 'date',
+      FALSE = 'false',
+      LOCATION = 'location',
+      PAGE = 'page',
+      STEP = 'step',
+      TIME = 'time',
+      TRUE = 'true',
+    }
+
+    export enum InvalidState {
+      FALSE = 'false',
+      TRUE = 'true',
+    }
+
+    export enum DefaultActionVerb {
+      ACTIVATE = 'activate',
+      CHECK = 'check',
+      CLICK = 'click',
+      CLICK_ANCESTOR = 'clickAncestor',
+      JUMP = 'jump',
+      OPEN = 'open',
+      PRESS = 'press',
+      SELECT = 'select',
+      UNCHECK = 'uncheck',
+    }
+
+    export enum MarkerType {
+      ACTIVE_SUGGESTION = 'activeSuggestion',
+      GRAMMAR = 'grammar',
+      HIGHLIGHT = 'highlight',
+      SPELLING = 'spelling',
+      SUGGESTION = 'suggestion',
+      TEXT_MATCH = 'textMatch',
+    }
+
+    export enum IntentCommandType {
+      CLEAR_SELECTION = 'clearSelection',
+      DELETE = 'delete',
+      DICTATE = 'dictate',
+      EXTEND_SELECTION = 'extendSelection',
+      FORMAT = 'format',
+      HISTORY = 'history',
+      INSERT = 'insert',
+      MARKER = 'marker',
+      MOVE_SELECTION = 'moveSelection',
+      SET_SELECTION = 'setSelection',
+    }
+
+    export enum IntentInputEventType {
+      DELETE_BY_CUT = 'deleteByCut',
+      DELETE_BY_DRAG = 'deleteByDrag',
+      DELETE_CONTENT_BACKWARD = 'deleteContentBackward',
+      DELETE_CONTENT_FORWARD = 'deleteContentForward',
+      DELETE_HARD_LINE_BACKWARD = 'deleteHardLineBackward',
+      DELETE_HARD_LINE_FORWARD = 'deleteHardLineForward',
+      DELETE_SOFT_LINE_BACKWARD = 'deleteSoftLineBackward',
+      DELETE_SOFT_LINE_FORWARD = 'deleteSoftLineForward',
+      DELETE_WORD_BACKWARD = 'deleteWordBackward',
+      DELETE_WORD_FORWARD = 'deleteWordForward',
+      FORMAT_BOLD = 'formatBold',
+      FORMAT_INDENT = 'formatIndent',
+      FORMAT_ITALIC = 'formatItalic',
+      FORMAT_JUSTIFY_CENTER = 'formatJustifyCenter',
+      FORMAT_JUSTIFY_FULL = 'formatJustifyFull',
+      FORMAT_JUSTIFY_LEFT = 'formatJustifyLeft',
+      FORMAT_JUSTIFY_RIGHT = 'formatJustifyRight',
+      FORMAT_OUTDENT = 'formatOutdent',
+      FORMAT_REMOVE = 'formatRemove',
+      FORMAT_SET_BLOCK_TEXT_DIRECTION = 'formatSetBlockTextDirection',
+      FORMAT_STRIKE_THROUGH = 'formatStrikeThrough',
+      FORMAT_SUBSCRIPT = 'formatSubscript',
+      FORMAT_SUPERSCRIPT = 'formatSuperscript',
+      FORMAT_UNDERLINE = 'formatUnderline',
+      HISTORY_REDO = 'historyRedo',
+      HISTORY_UNDO = 'historyUndo',
+      INSERT_COMPOSITION_TEXT = 'insertCompositionText',
+      INSERT_FROM_DROP = 'insertFromDrop',
+      INSERT_FROM_PASTE = 'insertFromPaste',
+      INSERT_FROM_YANK = 'insertFromYank',
+      INSERT_HORIZONTAL_RULE = 'insertHorizontalRule',
+      INSERT_LINE_BREAK = 'insertLineBreak',
+      INSERT_ORDERED_LIST = 'insertOrderedList',
+      INSERT_PARAGRAPH = 'insertParagraph',
+      INSERT_REPLACEMENT_TEXT = 'insertReplacementText',
+      INSERT_TEXT = 'insertText',
+      INSERT_TRANSPOSE = 'insertTranspose',
+      INSERT_UNORDERED_LIST = 'insertUnorderedList',
+    }
+
+    enum IntentTextBoundaryType {
+      CHARACTER = 'character',
+      FORMAT_END = 'formatEnd',
+      FORMAT_START = 'formatStart',
+      FORMAT_START_OR_END = 'formatStartOrEnd',
+      LINE_END = 'lineEnd',
+      LINE_START = 'lineStart',
+      LINE_START_OR_END = 'lineStartOrEnd',
+      OBJECT = 'object',
+      PAGE_END = 'pageEnd',
+      PAGE_START = 'pageStart',
+      PAGE_START_OR_END = 'pageStartOrEnd',
+      PARAGRAPH_END = 'paragraphEnd',
+      PARAGRAPH_START = 'paragraphStart',
+      PARAGRAPH_START_OR_END = 'paragraphStartOrEnd',
+      PARAGRAPH_START_SKIPPING_EMPTY_PARAGRAPHS =
+          'paragraphStartSkippingEmptyParagraphs',
+      SENTENCE_END = 'sentenceEnd',
+      SENTENCE_START = 'sentenceStart',
+      SENTENCE_START_OR_END = 'sentenceStartOrEnd',
+      WEB_PAGE = 'webPage',
+      WORD_END = 'wordEnd',
+      WORD_START = 'wordStart',
+      WORD_START_OR_END = 'wordStartOrEnd',
+    }
+
+    export enum IntentMoveDirectionType {
+      BACKWARD = 'backward',
+      FORWARD = 'forward',
+    }
+
+    export enum SortDirectionType {
+      ASCENDING = 'ascending',
+      DESCENDING = 'descending',
+      OTHER = 'other',
+      UNSORTED = 'unsorted',
+    }
+
+    export enum PositionType {
+      NULL = 'null',
+      TEXT = 'text',
+      TREE = 'tree',
+    }
+
+    export enum TreeChangeObserverFilter {
+      ALL_TREE_CHANGES = 'allTreeChanges',
+      LIVE_REGION_TREE_CHANGES = 'liveRegionTreeChanges',
+      NO_TREE_CHANGES = 'noTreeChanges',
+      TEXT_MARKER_CHANGES = 'textMarkerChanges',
+    }
+
+    export interface Rect {
+      left: number;
+      height: number;
+      top: number;
+      width: number;
+    }
+
+    export interface FindParams {
+      attributes?: object;
+      role?: RoleType;
+      state?: object;
+    }
+
+    export interface SetDocumentSelectionParams {
+      anchorObject: AutomationNode;
+      anchorOffset: number;
+      focusObject: AutomationNode;
+      focusOffset: number;
+    }
+
+    export interface AutomationIntent {
+      command: IntentCommandType;
+      moveDirection: IntentMoveDirectionType;
+      textBoundary: IntentTextBoundaryType;
+    }
+
+    export interface AutomationEvent {
+      eventFrom: string;
+      intents: AutomationIntent[];
+      mouseX?: number;
+      mouseY?: number;
+      target: AutomationNode;
+      type: EventType;
+
+      stopPropagation(): void;
+    }
+
+    export interface TreeChange {
+      target: AutomationNode;
+      type: TreeChangeType;
+    }
+
+    export interface CustomAction {
+      description: string;
+      id: number;
+    }
+
+    export interface LanguageSpan {
+      endIndex: number;
+      language: string;
+      probability: number;
+      startIndex: number;
+    }
+
+    export interface Marker {
+      endOffset: number;
+      flags: {[key in MarkerType]: boolean;};
+      startOffset: number;
+    }
+
+    export interface AutomationPosition {
+      affinity: string;
+      childIndex?: number;
+      node?: AutomationNode;
+      textOffset?: number;
+
+      asLeafTextPosition(): void;
+      asTextPosition(): void;
+      asTreePosition(): void;
+      atEndOfAnchor(): boolean;
+      atEndOfDocument(): boolean;
+      atEndOfFormat(): boolean;
+      atEndOfLine(): boolean;
+      atEndOfPage(): boolean;
+      atEndOfParagraph(): boolean;
+      atEndOfWord(): boolean;
+      atStartOfAnchor(): boolean;
+      atStartOfDocument(): boolean;
+      atStartOfFormat(): boolean;
+      atStartOfLine(): boolean;
+      atStartOfPage(): boolean;
+      atStartOfParagraph(): boolean;
+      atStartOfWord(): boolean;
+      getText(): string;
+      isInLineBreak(): boolean;
+      isInTextObject(): boolean;
+      isInWhiteSpace(): boolean;
+      isLeafTextPosition(): boolean;
+      isNullPosition(): boolean;
+      isTextPosition(): boolean;
+      isTreePosition(): boolean;
+      isValid(): boolean;
+      moveToNextAnchorPosition(): void;
+      moveToNextCharacterPosition(): void;
+      moveToNextFormatEndPosition(): void;
+      moveToNextFormatStartPosition(): void;
+      moveToNextLeafTextPosition(): void;
+      moveToNextLeafTreePosition(): void;
+      moveToNextLineEndPosition(): void;
+      moveToNextLineStartPosition(): void;
+      moveToNextPageEndPosition(): void;
+      moveToNextPageStartPosition(): void;
+      moveToNextParagraphEndPosition(): void;
+      moveToNextParagraphStartPosition(): void;
+      moveToNextWordEndPosition(): void;
+      moveToNextWordStartPosition(): void;
+      moveToParentPosition(): void;
+      moveToPositionAtEndOfAnchor(): void;
+      moveToPositionAtEndOfDocument(): void;
+      moveToPositionAtStartOfAnchor(): void;
+      moveToPositionAtStartOfDocument(): void;
+      moveToPreviousAnchorPosition(): void;
+      moveToPreviousCharacterPosition(): void;
+      moveToPreviousFormatEndPosition(): void;
+      moveToPreviousFormatStartPosition(): void;
+      moveToPreviousLeafTextPosition(): void;
+      moveToPreviousLeafTreePosition(): void;
+      moveToPreviousLineEndPosition(): void;
+      moveToPreviousLineStartPosition(): void;
+      moveToPreviousPageEndPosition(): void;
+      moveToPreviousPageStartPosition(): void;
+      moveToPreviousParagraphEndPosition(): void;
+      moveToPreviousParagraphStartPosition(): void;
+      moveToPreviousWordStartPosition(): void;
+      moveToPreviousWordEndPosition(): void;
+    }
+
+    export interface AutomationNode {
+      accessKey?: string;
+      activeDescendant?: AutomationNode;
+      activeDescendantFor?: AutomationNode[];
+      anchorAffinity?: string;
+      anchorObject?: AutomationNode;
+      anchorOffset?: number;
+      appId?: string;
+      ariaColumnCount?: number;
+      ariaCurrentState?: AriaCurrentState;
+      ariaInvalidValue?: string;
+      ariaRowCount?: number;
+      autoComplete?: string;
+      backgroundColor?: number;
+      bold: boolean;
+      busy?: boolean;
+      checked?: string;
+      checkedStateDescription?: string;
+      children: AutomationNode[];
+      className?: string;
+      clickable: boolean;
+      color?: number;
+      colorValue?: number;
+      containerLiveAtomic?: boolean;
+      containerLiveBusy?: boolean;
+      containerLiveRelevant?: string;
+      containerLiveStatus?: string;
+      controlledBy?: AutomationNode[];
+      controls?: AutomationNode[];
+      customActions?: CustomAction[];
+      defaultActionVerb?: DefaultActionVerb;
+      describedBy?: AutomationNode[];
+      descriptionFor?: AutomationNode[];
+      details?: AutomationNode[];
+      detailsFor?: AutomationNode[];
+      detectedLanguage?: string;
+      display?: string;
+      docLoaded?: boolean;
+      docLoadingProgress?: number;
+      docUrl?: string;
+      docTitle?: string;
+      doDefaultLabel?: string;
+      errorMessage?: AutomationNode;
+      errorMessageFor?: AutomationNode[];
+      firstChild?: AutomationNode;
+      flowFrom?: AutomationNode[];
+      flowTo?: AutomationNode[];
+      focusAffinity?: string;
+      focusObject?: AutomationNode;
+      focusOffset?: number;
+      fontFamily?: string;
+      fontSize?: number;
+      hasPopup?: HasPopup;
+      hierarchicalLevel?: number;
+      htmlAttributes?: {
+        [key: string]: string,
+      };
+      htmlTag?: string;
+      imageAnnotation?: string;
+      imageDataUrl?: string;
+      indexInParent?: number;
+      innerHtml?: string;
+      inPageLinkTarget?: AutomationNode;
+      inputType?: string;
+      invalidState?: InvalidState;
+      isButton: boolean;
+      isCheckBox: boolean;
+      isComboBox: boolean;
+      isImage: boolean;
+      isRootNode: boolean;
+      isSelectionBackward?: boolean;
+      italic: boolean;
+      labelFor?: AutomationNode[];
+      labelledBy?: AutomationNode[];
+      language?: string;
+      lastChild?: AutomationNode;
+      lineThrough: boolean;
+      liveAtomic?: boolean;
+      liveRelevant?: string;
+      liveStatus?: string;
+      location?: Rect;
+      longClickLabel?: string;
+      markers?: Marker[];
+      maxValueForRange?: number;
+      minValueForRange?: number;
+      modal?: boolean;
+      name?: string;
+      nameFrom?: NameFromType;
+      nextFocus?: AutomationNode;
+      nextOnLine?: AutomationNode;
+      nextSibling?: AutomationNode;
+      nonAtomicTextFieldRoot: boolean;
+      nonInlineTextWordStarts?: number[];
+      nonInlineTextWordEnds?: number[];
+      notUserSelectableStyle?: boolean;
+      parent?: AutomationNode;
+      placeholder?: string;
+      posInSet?: number;
+      previousFocus?: AutomationNode;
+      previousOnLine?: AutomationNode;
+      previousSibling?: AutomationNode;
+      restriction?: Restriction;
+      role?: RoleType;
+      roleDescription?: string;
+      root?: AutomationNode;
+      scrollable?: boolean;
+      scrollX?: number;
+      scrollXMin?: number;
+      scrollXMax?: number;
+      scrollY?: number;
+      scrollYMin?: number;
+      scrollYMax?: number;
+      selected?: boolean;
+      selectionEndAffinity?: string;
+      selectionEndObject?: AutomationNode;
+      selectionEndOffset?: number;
+      selectionStartAffinity?: string;
+      selectionStartObject?: AutomationNode;
+      selectionStartOffset?: number;
+      sentenceEnds?: number[];
+      sentenceStarts?: number[];
+      setSize?: number;
+      sortDirection: SortDirectionType;
+      standardActions?: ActionType[];
+      state?: {[key in StateType]: boolean;};
+      subscript: boolean;
+      superscript: boolean;
+      tableCellAriaColumnIndex?: number;
+      tableCellAriaRowIndex?: number;
+      tableCellColumnHeaders?: AutomationNode[];
+      tableCellColumnIndex?: number;
+      tableCellRowHeaders?: AutomationNode[];
+      tableCellRowIndex?: number;
+      tableCellRowSpan?: number;
+      tableColumnCount?: number;
+      tableColumnHeader?: AutomationNode;
+      tableColumnIndex?: number;
+      tableRowCount?: number;
+      tableRowHeader?: AutomationNode;
+      tableRowIndex?: number;
+      textSelEnd?: number;
+      textSelStart?: number;
+      tooltip?: string;
+      unclippedLocation?: Rect;
+      underline: boolean;
+      url?: string;
+      value?: string;
+      valueForRange?: number;
+      wordStarts?: number[];
+      wordEnds?: number[];
+
+
+      addEventListener(
+          type: EventType, listener: AutomationListener,
+          capture: boolean): void;
+      boundsForRange(
+          startIndex: number, endIndex: number,
+          callback: BoundsForRangeCallback): void;
+      createPosition(type: PositionType, offset: number, isUpstream?: boolean):
+          AutomationPosition;
+      doDefault(): void;
+      domQuerySelector(selector: string, callback: QueryCallback): void;
+      find(params: FindParams): AutomationNode|undefined;
+      findAll(params: FindParams): AutomationNode[];
+      focus(): void;
+      getImageData(maxWidth: number, maxHeight: number): void;
+      getNextTextMatch(searchStr: string, backward: boolean): AutomationNode;
+      hitTest(x: number, y: number, eventToFire: EventType): void;
+      hitTestWithReply(
+          x: number, y: number, callback: PerformActionCallbackWithNode): void;
+      languageAnnotationForStringAttribute(attribute: string): LanguageSpan[];
+      longClick(): void;
+      makeVisible(): void;
+      matches(params: FindParams): boolean;
+      performCustomAction(id: number): void;
+      performStandardAction(type: ActionType): void;
+      removeEventListener(
+          type: EventType, listener: AutomationListener,
+          capture: boolean): void;
+      replaceSelectedText(value: string): void;
+      resumeMedia(): void;
+      scrollBackward(callback?: PerformActionCallback): void;
+      scrollDown(callback?: PerformActionCallback): void;
+      scrollForward(callback?: PerformActionCallback): void;
+      scrollLeft(callback?: PerformActionCallback): void;
+      scrollRight(callback?: PerformActionCallback): void;
+      scrollToPoint(x: number, y: number): void;
+      scrollUp(callback?: PerformActionCallback): void;
+      setAccessibilityFocus(): void;
+      setScrollOffset(x: number, y: number): void;
+      setSelection(startIndex: number, endIndex: number): void;
+      setSequentialFocusNavigationStartingPoint(): void;
+      setValue(value: string): void;
+      showContextMenu(): void;
+      startDuckingMedia(): void;
+      stopDuckingMedia(): void;
+      suspendMedia(): void;
+      unclippedBoundsForRange(
+          startIndex: number, endIndex: number,
+          callback: BoundsForRangeCallback): void;
+    }
+
+    type AutomationListener = (event: AutomationEvent) => void;
+    type BoundsForRangeCallback = (bounds: Rect) => void;
+    type FocusCallback = (focusedNode: AutomationNode) => void;
+    type PerformActionCallback = (result: boolean) => void;
+    type PerformActionCallbackWithNode = (node: AutomationNode) => void;
+    type QueryCallback = (node: AutomationNode) => void;
+    type RootCallback = (rootNode: AutomationNode) => void;
+    type TreeChangeObserver = (change: TreeChange) => void;
+
+    export function addTreeChangeObserver(
+        filter: TreeChangeObserverFilter, observer: TreeChangeObserver): void;
+    export function getAccessibilityFocus(callback: FocusCallback): void;
+    export function getDesktop(callback: RootCallback): void;
+    export function getFocus(callback: FocusCallback): void;
+    export function getTree(tabId: number|undefined, callback: RootCallback):
+        void;
+    export function removeTreeChangeObserver(observer: TreeChangeObserver):
+        void;
+    export function setDocumentSelection(params: SetDocumentSelectionParams):
+        void;
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/definitions/i18n.d.ts b/chrome/browser/resources/chromeos/accessibility/definitions/i18n.d.ts
new file mode 100644
index 0000000..22d7d11
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/definitions/i18n.d.ts
@@ -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.
+
+/** @fileoverview Definitions for chrome.i18n API */
+// TODO(crbug.com/1203307): Auto-generate this file.
+declare namespace chrome {
+  export namespace i18n {
+
+    export function getAcceptLanguages(callback: (languages: string[]) => void):
+        void;
+
+    export function getMessage(
+        messageName: string, args?: string|string[],
+        options?: {escapeLt: boolean}): string;
+
+    export function getUILanguage(): string;
+
+    interface DetectLanguageResult {
+      isReliable: boolean;
+      languages: Array<{
+        language: string,
+        percentage: number,
+      }>;
+    }
+
+    export function detectLanguage(
+        text: string, callback: (result: DetectLanguageResult) => void): void;
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/definitions/settings_private_mv2.d.ts b/chrome/browser/resources/chromeos/accessibility/definitions/settings_private_mv2.d.ts
new file mode 100644
index 0000000..c46462b
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/definitions/settings_private_mv2.d.ts
@@ -0,0 +1,84 @@
+// 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.
+
+/** @fileoverview Definitions for chrome.settingsPrivate API in Manifest V2 */
+// This file exists because MV3 supports promises and MV2 does not.
+// TODO(b/260590502): Delete this after MV3 migration.
+// TODO(crbug.com/1203307): Auto-generate this file.
+
+import {ChromeEvent} from '../../../../../../tools/typescript/definitions/chrome_event';
+
+declare global {
+  export namespace chrome {
+    export namespace settingsPrivate {
+      export enum PrefType {
+        BOOLEAN = 'BOOLEAN',
+        NUMBER = 'NUMBER',
+        STRING = 'STRING',
+        URL = 'URL',
+        LIST = 'LIST',
+        DICTIONARY = 'DICTIONARY',
+      }
+
+      export enum ControlledBy {
+        DEVICE_POLICY = 'DEVICE_POLICY',
+        USER_POLICY = 'USER_POLICY',
+        OWNER = 'OWNER',
+        PRIMARY_USER = 'PRIMARY_USER',
+        EXTENSION = 'EXTENSION',
+        PARENT = 'PARENT',
+        CHILD_RESTRICTION = 'CHILD_RESTRICTION',
+      }
+
+      export enum Enforcement {
+        ENFORCED = 'ENFORCED',
+        RECOMMENDED = 'RECOMMENDED',
+        PARENT_SUPERVISED = 'PARENT_SUPERVISED',
+      }
+
+      // Callback Types
+      type GetAllPrefsCallback = (prefs: PrefObject[]) => void;
+      type OnPrefSetCallback = (success: boolean) => void;
+      type GetPrefCallback = (pref: PrefObject) => void;
+      // TODO(crbug/1373934) Update existing usages of PrefObject to be typed,
+      // removing the need to use any here.
+      export interface PrefObject<T = any> {
+        key: string;
+        type:
+            // clang-format off
+            T extends boolean ? PrefType.BOOLEAN :
+            T extends number ? PrefType.NUMBER :
+            T extends string ? PrefType.STRING | PrefType.URL :
+            T extends unknown[] ? PrefType.LIST :
+            T extends Record<string|number, unknown> ? PrefType.DICTIONARY :
+            never;
+        // clang-format on
+        value: T;
+        controlledBy?: ControlledBy;
+        controlledByName?: string;
+        enforcement?: Enforcement;
+        recommendedValue?: T;
+        userSelectableValues?: T[];
+        userControlDisabled?: boolean;
+        extensionId?: string;
+        extensionCanBeDisabled?: boolean;
+      }
+
+      export function getAllPrefs(callback: GetAllPrefsCallback): void;
+      export function getPref(name: string, callback: GetPrefCallback): void;
+
+      export function setPref(
+          name: string, value: any, pageId?: string,
+          callback?: OnPrefSetCallback): void;
+
+      export function getDefaultZoom(callback: (arg: number) => void): void;
+      export function setDefaultZoom(
+          zoom: number, callback?: (arg: boolean) => void): void;
+
+      type PrefsCallback = (prefs: PrefObject[]) => void;
+
+      export const onPrefsChanged: ChromeEvent<PrefsCallback>;
+    }
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/definitions/storage_mv2.d.ts b/chrome/browser/resources/chromeos/accessibility/definitions/storage_mv2.d.ts
new file mode 100644
index 0000000..86c2251f
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/definitions/storage_mv2.d.ts
@@ -0,0 +1,47 @@
+// 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.
+
+/** @fileoverview Definitions for chrome.storage API in Manifest V2 */
+// This file exists because MV3 supports promises and MV2 does not.
+// TODO(b/260590502): Delete this after MV3 migration.
+// TODO(crbug.com/1203307): Auto-generate this file.
+
+import {ChromeEvent} from '../../../../../../tools/typescript/definitions/chrome_event';
+
+declare global {
+  export namespace chrome {
+    export namespace storage {
+      export const sync: StorageArea;
+      export const local: StorageArea;
+      export const managed: StorageArea;
+      export const onChanged: StorageChangeEvent;
+
+      export type StorageChangeEvent = ChromeEvent<
+          (changes: {[x: string]: StorageChange}, areaName: string) => void>;
+
+      export type StorageAreaChangeEvent =
+          ChromeEvent<(changes: {[x: string]: StorageChange}) => void>;
+
+      export interface StorageChange {
+        oldValue?: any;
+        newValue?: any;
+      }
+
+      export class StorageArea {
+        public get(
+            keysOrCallback?: string|string[]|object|((obj: any) => void),
+            callback?: (obj: any) => void): void;
+
+        public getBytesInUse(
+            keysOrCallback?: string|string[]|((obj: any) => void),
+            callback?: (num: number) => void): void;
+
+        public set(items: {[x: string]: any}, callback?: () => void): void;
+        public remove(keys: string|string[], callback?: () => void): void;
+        public clear(callback?: () => void): void;
+        public onChanged: StorageAreaChangeEvent;
+      }
+    }
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/definitions/tts.d.ts b/chrome/browser/resources/chromeos/accessibility/definitions/tts.d.ts
new file mode 100644
index 0000000..58741529
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/definitions/tts.d.ts
@@ -0,0 +1,72 @@
+// 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 {ChromeEvent} from '../../../../../../tools/typescript/definitions/chrome_event';
+
+// TODO(crbug.com/1203307): Auto-generate this file.
+
+declare global {
+  namespace chrome {
+    export namespace tts {
+
+      export enum EventType {
+        START = 'start',
+        END = 'end',
+        WORD = 'word',
+        SENTENCE = 'sentence',
+        MARKER = 'marker',
+        INTERRUPTED = 'interrupted',
+        CANCELLED = 'cancelled',
+        ERROR = 'error',
+        PAUSE = 'pause',
+        RESUME = 'resume',
+      }
+
+      export class TtsOptions {
+        enqueue?: boolean;
+        voiceName?: string;
+        extensionId?: string;
+        lang?: string;
+        rate?: number;
+        pitch?: number;
+        volume?: number;
+        requiredEventTypes?: string[];
+        desiredEventTypes?: string[];
+        onEvent?: (event: TtsEvent) => void;
+      }
+
+      export interface TtsEvent {
+        type: EventType;
+        charIndex?: number;
+        errorMessage?: string;
+        srcId?: number;
+        isFinalEvent?: boolean;
+        length?: number;
+      }
+
+      export interface TtsVoice {
+        voiceName?: string;
+        lang?: string;
+        remote?: boolean;
+        extensionId?: string;
+        eventTypes?: EventType[];
+      }
+
+      export function speak(
+          utterance: string, options: TtsOptions, callback?: () => void): void;
+
+      export function stop(): void;
+
+      export function pause(): void;
+
+      export function resume(): void;
+
+      export function isSpeaking(callback?: (param: boolean) => void): void;
+
+      export function getVoices(callback?: (param: TtsVoice[]) => void): void;
+
+      export const onEvent: ChromeEvent<(event: TtsEvent) => void>;
+    }
+  }
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/tsconfig.base.json b/chrome/browser/resources/chromeos/accessibility/tsconfig.base.json
new file mode 100644
index 0000000..5502828
--- /dev/null
+++ b/chrome/browser/resources/chromeos/accessibility/tsconfig.base.json
@@ -0,0 +1,6 @@
+{
+  "extends": "../../../../../tools/typescript/tsconfig_base.json",
+  "compilerOptions": {
+    "allowJs": true
+  }
+}
diff --git a/chrome/browser/resources/chromeos/audio/BUILD.gn b/chrome/browser/resources/chromeos/audio/BUILD.gn
index 2f09c41..ddfa1afc 100644
--- a/chrome/browser/resources/chromeos/audio/BUILD.gn
+++ b/chrome/browser/resources/chromeos/audio/BUILD.gn
@@ -31,7 +31,7 @@
 ts_library("build_ts") {
   deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_audio",
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
index 56d81cbf..5a758af 100644
--- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
@@ -29,7 +29,7 @@
       "//ui/webui/resources/cr_components/localized_link:build_ts",
       "//ui/webui/resources/cr_elements:build_ts",
       "//ui/webui/resources/js:build_ts",
-      "//ui/webui/resources/mojo:library",
+      "//ui/webui/resources/mojo:build_ts",
     ]
 
     excludes = [
diff --git a/chrome/browser/resources/chromeos/cloud_upload/BUILD.gn b/chrome/browser/resources/chromeos/cloud_upload/BUILD.gn
index 67289ff..17756f0 100644
--- a/chrome/browser/resources/chromeos/cloud_upload/BUILD.gn
+++ b/chrome/browser/resources/chromeos/cloud_upload/BUILD.gn
@@ -53,6 +53,6 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn b/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
index 3a21a761..23ad344 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
+++ b/chrome/browser/resources/chromeos/emoji_picker/BUILD.gn
@@ -215,7 +215,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_checked_in_ts_js_files",
diff --git a/chrome/browser/resources/chromeos/healthd_internals/BUILD.gn b/chrome/browser/resources/chromeos/healthd_internals/BUILD.gn
index b0091cd..391da9f 100644
--- a/chrome/browser/resources/chromeos/healthd_internals/BUILD.gn
+++ b/chrome/browser/resources/chromeos/healthd_internals/BUILD.gn
@@ -19,6 +19,6 @@
   ts_use_local_config = true
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
index e10f197..b6e0c29 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -37,7 +37,7 @@
       "//ash/webui/common/resources:preprocess",
       "//ui/webui/resources/cr_components/localized_link:build_ts",
       "//ui/webui/resources/cr_elements:build_ts",
-      "//ui/webui/resources/mojo:library",
+      "//ui/webui/resources/mojo:build_ts",
     ]
   }
 }
diff --git a/chrome/browser/resources/chromeos/launcher_internals/BUILD.gn b/chrome/browser/resources/chromeos/launcher_internals/BUILD.gn
index 8cedcdfe..c5ca61a 100644
--- a/chrome/browser/resources/chromeos/launcher_internals/BUILD.gn
+++ b/chrome/browser/resources/chromeos/launcher_internals/BUILD.gn
@@ -31,7 +31,7 @@
 ts_library("build_ts") {
   deps = [
     "//third_party/polymer/v3_0:library",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_mojo",
diff --git a/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn b/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
index a2c35df..89d9fc8 100644
--- a/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
+++ b/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
@@ -56,7 +56,7 @@
   ]
   composite = true
   enable_source_maps = true
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
 }
 
 resources_grd_file = "$target_gen_dir/resources.grd"
diff --git a/chrome/browser/resources/connectors_internals/BUILD.gn b/chrome/browser/resources/connectors_internals/BUILD.gn
index a082d4d7..ca1e54c 100644
--- a/chrome/browser/resources/connectors_internals/BUILD.gn
+++ b/chrome/browser/resources/connectors_internals/BUILD.gn
@@ -20,7 +20,7 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/discards/BUILD.gn b/chrome/browser/resources/discards/BUILD.gn
index dbbc0e9..c49a56a 100644
--- a/chrome/browser/resources/discards/BUILD.gn
+++ b/chrome/browser/resources/discards/BUILD.gn
@@ -40,7 +40,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   extra_grdp_files = [ "$target_gen_dir/discards_graph_tab.grdp" ]
diff --git a/chrome/browser/resources/downloads/BUILD.gn b/chrome/browser/resources/downloads/BUILD.gn
index 493fe15..4f432ea 100644
--- a/chrome/browser/resources/downloads/BUILD.gn
+++ b/chrome/browser/resources/downloads/BUILD.gn
@@ -46,7 +46,7 @@
     "//ui/webui/resources/cr_components/managed_footnote:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/chrome/browser/resources/engagement/BUILD.gn b/chrome/browser/resources/engagement/BUILD.gn
index 008aa34..0cfb552 100644
--- a/chrome/browser/resources/engagement/BUILD.gn
+++ b/chrome/browser/resources/engagement/BUILD.gn
@@ -24,7 +24,7 @@
 
   deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [ ":copy_src_and_mojo" ]
 }
diff --git a/chrome/browser/resources/feed/BUILD.gn b/chrome/browser/resources/feed/BUILD.gn
index 5e6865a..bdd5146 100644
--- a/chrome/browser/resources/feed/BUILD.gn
+++ b/chrome/browser/resources/feed/BUILD.gn
@@ -22,5 +22,5 @@
       [ "$root_gen_dir/chrome/browser/ui/webui/feed/feed.mojom-webui.ts" ]
 
   ts_use_local_config = false
-  ts_deps = [ "//ui/webui/resources/mojo:library" ]
+  ts_deps = [ "//ui/webui/resources/mojo:build_ts" ]
 }
diff --git a/chrome/browser/resources/feed_internals/BUILD.gn b/chrome/browser/resources/feed_internals/BUILD.gn
index 9a7d9cdf..fa63ff3 100644
--- a/chrome/browser/resources/feed_internals/BUILD.gn
+++ b/chrome/browser/resources/feed_internals/BUILD.gn
@@ -22,7 +22,7 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo/:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/history/BUILD.gn b/chrome/browser/resources/history/BUILD.gn
index 9bb0e76..e31d6e35 100644
--- a/chrome/browser/resources/history/BUILD.gn
+++ b/chrome/browser/resources/history/BUILD.gn
@@ -57,7 +57,7 @@
     "//ui/webui/resources/cr_components/managed_footnote:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/chrome/browser/resources/internals/user_education/BUILD.gn b/chrome/browser/resources/internals/user_education/BUILD.gn
index 6502d7b2..cd20aa9a 100644
--- a/chrome/browser/resources/internals/user_education/BUILD.gn
+++ b/chrome/browser/resources/internals/user_education/BUILD.gn
@@ -57,7 +57,7 @@
     "//ui/webui/resources/cr_components/help_bubble:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":copy_mojo",
diff --git a/chrome/browser/resources/media/BUILD.gn b/chrome/browser/resources/media/BUILD.gn
index ade8f6f2..18fd0e4 100644
--- a/chrome/browser/resources/media/BUILD.gn
+++ b/chrome/browser/resources/media/BUILD.gn
@@ -33,6 +33,6 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/nearby_share/BUILD.gn b/chrome/browser/resources/nearby_share/BUILD.gn
index 4a762d8a..91e41ec 100644
--- a/chrome/browser/resources/nearby_share/BUILD.gn
+++ b/chrome/browser/resources/nearby_share/BUILD.gn
@@ -7,14 +7,12 @@
 import("//tools/grit/grit_rule.gni")
 import("//tools/grit/preprocess_if_expr.gni")
 import("//tools/polymer/html_to_wrapper.gni")
-import("//tools/typescript/ts_definitions.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 
 assert(is_chromeos_ash, "Nearby Share is CrOS only")
 
 preprocess_src_manifest = "preprocessed_src_manifest.json"
 preprocess_gen_manifest = "preprocessed_gen_manifest.json"
-preprocess_mojo_manifest = "preprocessed_mojo_manifest.json"
 preprocess_folder = "preprocessed"
 
 grit("resources") {
@@ -37,22 +35,15 @@
   grd_prefix = "nearby_share_dialog"
   out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
   deps = [
-    ":build_mojo_grdp",
     ":preprocess_gen",
     ":preprocess_src",
+    "shared:build_json_grdp",
     "shared:build_v3_grdp",
   ]
   grdp_files = [
-    "$target_gen_dir/nearby_share_mojo_resources.grdp",
+    "$target_gen_dir/shared/nearby_share_json_resources.grdp",
     "$target_gen_dir/shared/nearby_share_resources_v3.grdp",
   ]
-  input_files = [
-    "nearby_share_progress_bar_dark.json",
-    "nearby_share_progress_bar_light.json",
-    "nearby_share_pulse_animation_dark.json",
-    "nearby_share_pulse_animation_light.json",
-  ]
-  input_files_base_dir = rebase_path("shared", "//")
   manifest_files = [
     "$target_gen_dir/$preprocess_src_manifest",
     "$target_gen_dir/$preprocess_gen_manifest",
@@ -99,45 +90,6 @@
   in_files = html_wrapper_files
 }
 
-generate_grd("build_mojo_grdp") {
-  grd_prefix = "nearby_share"
-  out_grd = "$target_gen_dir/${grd_prefix}_mojo_resources.grdp"
-  deps = [ ":preprocess_mojo" ]
-  manifest_files = [ "$target_gen_dir/$preprocess_mojo_manifest" ]
-  resource_path_rewrites = [
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share.mojom-webui.js|mojo/nearby_share.mojom-webui.js",
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share_share_type.mojom-webui.js|mojo/nearby_share_share_type.mojom-webui.js",
-  ]
-}
-
-# Mojo files, for generating grdp
-preprocess_if_expr("preprocess_mojo") {
-  deps = [
-    "//chrome/browser/ui/webui/nearby_share:mojom_webui_js",
-    "//chrome/browser/ui/webui/nearby_share:share_type_webui_js",
-    "//chromeos/ash/services/nearby/public/mojom:nearby_share_settings_webui_js",
-  ]
-  in_folder = root_gen_dir
-  out_folder = "$target_gen_dir/$preprocess_folder"
-  out_manifest = "$target_gen_dir/$preprocess_mojo_manifest"
-  in_files = [
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share.mojom-webui.js",
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share_share_type.mojom-webui.js",
-  ]
-}
-
-ts_definitions("generate_definitions") {
-  deps = [ "//ui/webui/resources/mojo:library" ]
-  extra_deps = [ ":preprocess_mojo" ]
-  root_dir = "$target_gen_dir/$preprocess_folder"
-  out_dir = "$target_gen_dir/$preprocess_folder"
-
-  js_files = [
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share.mojom-webui.js",
-    "mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share_share_type.mojom-webui.js",
-  ]
-}
-
 js_type_check("closure_compile") {
   is_polymer3 = true
   closure_flags = default_closure_args + mojom_js_args + [
@@ -152,7 +104,7 @@
                     "js_module_root=" + rebase_path(
                             "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/nearby_share/",
                             root_build_dir),
-                    "browser_resolver_prefix_replacements=\"/mojo/=./\"",
+                    "browser_resolver_prefix_replacements=\"./shared/mojo/=./\"",
                   ]
   deps = [
     ":app",
diff --git a/chrome/browser/resources/nearby_share/app.js b/chrome/browser/resources/nearby_share/app.js
index 2bc0c31..87af9687 100644
--- a/chrome/browser/resources/nearby_share/app.js
+++ b/chrome/browser/resources/nearby_share/app.js
@@ -9,11 +9,11 @@
 import './nearby_discovery_page.js';
 import 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
 
-import {ConfirmationManagerInterface, PayloadPreview, ShareTarget, TransferUpdateListenerPendingReceiver} from '/mojo/nearby_share.mojom-webui.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './app.html.js';
+import {ConfirmationManagerInterface, PayloadPreview, ShareTarget, TransferUpdateListenerPendingReceiver} from './shared/mojo/nearby_share.mojom-webui.js';
 import {NearbyShareSettingsMixin} from './shared/nearby_share_settings_mixin.js';
 import {CloseReason} from './shared/types.js';
 
diff --git a/chrome/browser/resources/nearby_share/discovery_manager.js b/chrome/browser/resources/nearby_share/discovery_manager.js
index 16850d6d..6f116f3 100644
--- a/chrome/browser/resources/nearby_share/discovery_manager.js
+++ b/chrome/browser/resources/nearby_share/discovery_manager.js
@@ -7,7 +7,7 @@
  * DiscoveryManager which allows interaction with native code.
  */
 
-import {DiscoveryManager, DiscoveryManagerInterface, DiscoveryObserverInterface, DiscoveryObserverReceiver, DiscoveryObserverRemote} from '/mojo/nearby_share.mojom-webui.js';
+import {DiscoveryManager, DiscoveryManagerInterface, DiscoveryObserverInterface, DiscoveryObserverReceiver, DiscoveryObserverRemote} from './shared/mojo/nearby_share.mojom-webui.js';
 
 /** @type {?DiscoveryManagerInterface} */
 let discoveryManager = null;
diff --git a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
index b430c54..e1863260 100644
--- a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
+++ b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -17,12 +17,12 @@
 import './shared/nearby_progress.js';
 import './strings.m.js';
 
-import {ConfirmationManagerInterface, PayloadPreview, ShareTarget, TransferStatus, TransferUpdateListenerInterface, TransferUpdateListenerPendingReceiver, TransferUpdateListenerReceiver} from '/mojo/nearby_share.mojom-webui.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getDiscoveryManager} from './discovery_manager.js';
 import {getTemplate} from './nearby_confirmation_page.html.js';
+import {ConfirmationManagerInterface, PayloadPreview, ShareTarget, TransferStatus, TransferUpdateListenerInterface, TransferUpdateListenerPendingReceiver, TransferUpdateListenerReceiver} from './shared/mojo/nearby_share.mojom-webui.js';
 import {CloseReason} from './shared/types.js';
 
 /** @implements {TransferUpdateListenerInterface} */
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
index 1ce933f..54cc997 100644
--- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js
+++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -16,7 +16,6 @@
 import './shared/nearby_preview.js';
 import './strings.m.js';
 
-import {ConfirmationManagerInterface, DiscoveryObserverInterface, DiscoveryObserverReceiver, PayloadPreview, SelectShareTargetResult, ShareTarget, ShareTargetListenerCallbackRouter, StartDiscoveryResult, TransferUpdateListenerPendingReceiver} from '/mojo/nearby_share.mojom-webui.js';
 import {assert, assertNotReached} from 'chrome://resources/ash/common/assert.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {UnguessableToken} from 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js';
@@ -24,6 +23,7 @@
 
 import {getDiscoveryManager, observeDiscoveryManager} from './discovery_manager.js';
 import {getTemplate} from './nearby_discovery_page.html.js';
+import {ConfirmationManagerInterface, DiscoveryObserverInterface, DiscoveryObserverReceiver, PayloadPreview, SelectShareTargetResult, ShareTarget, ShareTargetListenerCallbackRouter, StartDiscoveryResult, TransferUpdateListenerPendingReceiver} from './shared/mojo/nearby_share.mojom-webui.js';
 
 /**
  * Converts an unguessable token to a string.
diff --git a/chrome/browser/resources/nearby_share/shared/BUILD.gn b/chrome/browser/resources/nearby_share/shared/BUILD.gn
index 3f20cbb..65e289c3 100644
--- a/chrome/browser/resources/nearby_share/shared/BUILD.gn
+++ b/chrome/browser/resources/nearby_share/shared/BUILD.gn
@@ -9,12 +9,13 @@
 
 assert(is_chromeos, "Nearby Share is CrOS only")
 
+grd_prefix = "nearby_share"
 preprocessed_dir = "$target_gen_dir/preprocessed"
 tsc_dir = "$target_gen_dir/tsc"
 
 # Grdp of JSON files for OS Settings.
 generate_grd("build_json_grdp") {
-  grd_prefix = "nearby_share"
+  grd_prefix = grd_prefix
   out_grd = "$target_gen_dir/nearby_share_json_resources.grdp"
   input_files_base_dir = rebase_path(".", "//")
   input_files = [
@@ -28,7 +29,7 @@
 # TODO(b/207087930) Consider moving these shared files to chrome://resources.
 # b/207087942 provides context why chrome://resources did not work previously.
 generate_grd("build_v3_grdp") {
-  grd_prefix = "nearby_share"
+  grd_prefix = grd_prefix
   out_grd = "$target_gen_dir/${grd_prefix}_resources_v3.grdp"
   deps = [ ":build_ts" ]
   manifest_files = [ "$target_gen_dir/build_ts.manifest" ]
@@ -86,28 +87,43 @@
   out_folder = preprocessed_dir
 }
 
+# TODO(b/270653607) Update this to generate TS sources instead and remove
+# allow_js argument from :build_ts. Also remove listing in
+# tools/typescript/validate_tsconfig.py.
+copy("copy_mojo") {
+  deps = [
+    "//chrome/browser/ui/webui/nearby_share:mojom_webui_js",
+    "//chrome/browser/ui/webui/nearby_share:share_type_webui_js",
+  ]
+  sources = [
+    "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share.mojom-webui.js",
+    "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share_share_type.mojom-webui.js",
+  ]
+  outputs = [ "$preprocessed_dir/mojo/{{source_file_part}}" ]
+}
+
 ts_library("build_ts") {
   tsconfig_base = "tsconfig_base.json"
+  allow_js = true
   deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
+    ":copy_mojo",
     ":html_wrapper_files",
     ":preprocess",
   ]
   root_dir = preprocessed_dir
-  in_files = web_component_files + non_web_component_files + html_wrapper_files
+  in_files =
+      web_component_files + non_web_component_files + html_wrapper_files + [
+        "mojo/nearby_share.mojom-webui.js",
+        "mojo/nearby_share_share_type.mojom-webui.js",
+      ]
   out_dir = tsc_dir
   definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-  path_mappings = [
-    # Additional path mappings for Nearby share Mojo files
-    "/mojo/nearby_share*|" + rebase_path(
-            "$root_gen_dir/chrome/browser/resources/nearby_share/preprocessed/mojom-webui/chrome/browser/ui/webui/nearby_share/nearby_share*",
-            target_gen_dir),
-  ]
 
   composite = true
 }
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_device.ts b/chrome/browser/resources/nearby_share/shared/nearby_device.ts
index 90b7549..4bdead01 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_device.ts
+++ b/chrome/browser/resources/nearby_share/shared/nearby_device.ts
@@ -13,10 +13,10 @@
 import './nearby_shared_icons.html.js';
 import './nearby_device_icon.js';
 
-import {ShareTarget} from '/mojo/nearby_share.mojom-webui.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {ShareTarget} from './mojo/nearby_share.mojom-webui.js';
 import {getTemplate} from './nearby_device.html.js';
 import {NearbyDeviceIconElement} from './nearby_device_icon.js';
 
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_device_icon.ts b/chrome/browser/resources/nearby_share/shared/nearby_device_icon.ts
index 5e6ef9e..d77648b2d 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_device_icon.ts
+++ b/chrome/browser/resources/nearby_share/shared/nearby_device_icon.ts
@@ -13,10 +13,10 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './nearby_shared_icons.html.js';
 
-import {ShareTarget} from '/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {ShareTarget} from './mojo/nearby_share.mojom-webui.js';
 import {getTemplate} from './nearby_device_icon.html.js';
 
 export class NearbyDeviceIconElement extends PolymerElement {
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_preview.ts b/chrome/browser/resources/nearby_share/shared/nearby_preview.ts
index 5810cd4..951a520 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_preview.ts
+++ b/chrome/browser/resources/nearby_share/shared/nearby_preview.ts
@@ -13,12 +13,12 @@
 import './nearby_shared_icons.html.js';
 import './nearby_shared_share_type_icons.html.js';
 
-import {PayloadPreview} from '/mojo/nearby_share.mojom-webui.js';
-import {ShareType} from '/mojo/nearby_share_share_type.mojom-webui.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {PayloadPreview} from './mojo/nearby_share.mojom-webui.js';
+import {ShareType} from './mojo/nearby_share_share_type.mojom-webui.js';
 import {getTemplate} from './nearby_preview.html.js';
 
 const NearbyPreviewElementBase = I18nMixin(PolymerElement);
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_progress.ts b/chrome/browser/resources/nearby_share/shared/nearby_progress.ts
index 34f67f9..2afbb4d 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_progress.ts
+++ b/chrome/browser/resources/nearby_share/shared/nearby_progress.ts
@@ -15,10 +15,10 @@
 import './nearby_shared_icons.html.js';
 import './nearby_device_icon.js';
 
-import {ShareTarget} from '/mojo/nearby_share.mojom-webui.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {ShareTarget} from './mojo/nearby_share.mojom-webui.js';
 import {NearbyDeviceIconElement} from './nearby_device_icon.js';
 import {getTemplate} from './nearby_progress.html.js';
 
diff --git a/chrome/browser/resources/new_tab_page/BUILD.gn b/chrome/browser/resources/new_tab_page/BUILD.gn
index 445a8a6..8fe8709 100644
--- a/chrome/browser/resources/new_tab_page/BUILD.gn
+++ b/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -92,7 +92,7 @@
     "//ui/webui/resources/cr_components/omnibox:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/chrome/browser/resources/new_tab_page_third_party/BUILD.gn b/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
index e6b8ad5a..929ad6e 100644
--- a/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
+++ b/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
@@ -19,7 +19,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_components/most_visited:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/omnibox/BUILD.gn b/chrome/browser/resources/omnibox/BUILD.gn
index 5a497e80..1978f4d 100644
--- a/chrome/browser/resources/omnibox/BUILD.gn
+++ b/chrome/browser/resources/omnibox/BUILD.gn
@@ -33,6 +33,6 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/reset_password/BUILD.gn b/chrome/browser/resources/reset_password/BUILD.gn
index 1e5c697..47183ee1 100644
--- a/chrome/browser/resources/reset_password/BUILD.gn
+++ b/chrome/browser/resources/reset_password/BUILD.gn
@@ -30,7 +30,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [ ":copy_src_and_mojo" ]
 }
diff --git a/chrome/browser/resources/segmentation_internals/BUILD.gn b/chrome/browser/resources/segmentation_internals/BUILD.gn
index 44af0d1..41e50d96 100644
--- a/chrome/browser/resources/segmentation_internals/BUILD.gn
+++ b/chrome/browser/resources/segmentation_internals/BUILD.gn
@@ -15,7 +15,7 @@
   mojo_files = [ "$root_gen_dir/chrome/browser/ui/webui/segmentation_internals/segmentation_internals.mojom-webui.ts" ]
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 5aa85d0..3f0ea72 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -23,7 +23,6 @@
 tsc_output_folder = "tsc"
 tsc_output_dir = "$target_gen_dir/$tsc_output_folder"
 
-nearby_share_mojo_dir = "$root_gen_dir/chrome/browser/resources/nearby_share/preprocessed/mojom-webui/chrome/browser/ui/webui/nearby_share"
 nearby_share_tsc_dir =
     "$root_gen_dir/chrome/browser/resources/nearby_share/shared/tsc"
 
@@ -60,10 +59,8 @@
       "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js",
       "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js",
     ]
-    external_paths = [
-      "/mojo/|" + rebase_path(nearby_share_mojo_dir, root_build_dir),
-      "/shared/|" + rebase_path(nearby_share_tsc_dir, root_build_dir),
-    ]
+    external_paths =
+        [ "/shared/|" + rebase_path(nearby_share_tsc_dir, root_build_dir) ]
   }
 }
 
@@ -81,7 +78,7 @@
     "//ui/webui/resources/cr_components/managed_footnote:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
     ":generate_css_wrapper_files",
@@ -89,11 +86,9 @@
     ":generate_mojom_webui",
     ":preprocess",
     "//ash/webui/common/resources:generate_definitions",
-    "//chrome/browser/resources/nearby_share:generate_definitions",
   ]
   path_mappings = [
     # Additional path mappings for Nearby share code
-    "/mojo/*|" + rebase_path("$nearby_share_mojo_dir/*", target_gen_dir),
     "/shared/*|" + rebase_path("$nearby_share_tsc_dir/*", target_gen_dir),
   ]
   definitions = ts_definition_files
@@ -102,6 +97,8 @@
       src_ts_files + html_wrapper_files + css_wrapper_files + mojom_webui_files
   out_dir = tsc_output_dir
 
+  # Allows .d.ts files to be generated for output JS files, so this build target
+  # can be referenced by other ts_library() targets (e.g. browser tests)
   composite = true
 }
 
@@ -261,14 +258,8 @@
     "os_settings_v3.html",
   ]
   input_files_base_dir = rebase_path(".", "//")
-  deps = [
-    "//chrome/browser/resources/nearby_share:build_mojo_grdp",
-    "//chrome/browser/resources/nearby_share/shared:build_json_grdp",
-  ]
-  grdp_files = [
-    "$root_gen_dir/chrome/browser/resources/nearby_share/nearby_share_mojo_resources.grdp",
-    "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_json_resources.grdp",
-  ]
+  deps = [ "//chrome/browser/resources/nearby_share/shared:build_json_grdp" ]
+  grdp_files = [ "$root_gen_dir/chrome/browser/resources/nearby_share/shared/nearby_share_json_resources.grdp" ]
   manifest_files = []
   resource_path_rewrites =
       [ "os_settings_v3.html|chromeos/os_settings_v3.html" ]
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts
index a639c76..f71fa08 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.ts
@@ -14,7 +14,7 @@
 import '/shared/nearby_preview.js';
 import '/shared/nearby_progress.js';
 
-import {ShareTarget, TransferStatus} from '/mojo/nearby_share.mojom-webui.js';
+import {ShareTarget, TransferStatus} from '/shared/mojo/nearby_share.mojom-webui.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts
index 5cb24092..32d7d10 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.ts
@@ -14,7 +14,7 @@
 import '/shared/nearby_page_template.js';
 import '/shared/nearby_shared_icons.html.js';
 
-import {RegisterReceiveSurfaceResult} from '/mojo/nearby_share.mojom-webui.js';
+import {RegisterReceiveSurfaceResult} from '/shared/mojo/nearby_share.mojom-webui.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts
index 41207bb..d3bb1a0 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.ts
@@ -29,7 +29,7 @@
 import './nearby_share_confirm_page.js';
 import './nearby_share_high_visibility_page.js';
 
-import {ReceiveManagerInterface, ReceiveObserverReceiver, RegisterReceiveSurfaceResult, ShareTarget, TransferMetadata, TransferStatus} from '/mojo/nearby_share.mojom-webui.js';
+import {ReceiveManagerInterface, ReceiveObserverReceiver, RegisterReceiveSurfaceResult, ShareTarget, TransferMetadata, TransferStatus} from '/shared/mojo/nearby_share.mojom-webui.js';
 import {NearbySettings} from '/shared/nearby_share_settings_mixin.js';
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_manager.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_manager.ts
index 8b0c0789a..d2878423 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_manager.ts
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_manager.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {ReceiveManager, ReceiveManagerInterface, ReceiveObserverInterface, ReceiveObserverReceiver, ReceiveObserverRemote} from '/mojo/nearby_share.mojom-webui.js';
+import {ReceiveManager, ReceiveManagerInterface, ReceiveObserverInterface, ReceiveObserverReceiver, ReceiveObserverRemote} from '/shared/mojo/nearby_share.mojom-webui.js';
 
 let receiveManager: ReceiveManagerInterface|null = null;
 let isTesting = false;
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts
index 02aac1d..b9d45979 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.ts
@@ -19,7 +19,7 @@
 import './nearby_share_data_usage_dialog.js';
 import './nearby_share_receive_dialog.js';
 
-import {ReceiveObserverReceiver, ShareTarget, TransferMetadata} from '/mojo/nearby_share.mojom-webui.js';
+import {ReceiveObserverReceiver, ShareTarget, TransferMetadata} from '/shared/mojo/nearby_share.mojom-webui.js';
 import {getContactManager} from '/shared/nearby_contact_manager.js';
 import {NearbySettings} from '/shared/nearby_share_settings_mixin.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.ts b/chrome/browser/resources/settings/chromeos/os_settings.ts
index 6502c6c..8328fc8 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings.ts
@@ -121,6 +121,7 @@
 import './parental_controls_page/parental_controls_page.js';
 import './settings_scheduler_slider/settings_scheduler_slider.js';
 
+import * as nearbyShareMojom from '/shared/mojo/nearby_share.mojom-webui.js';
 import {startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 
@@ -218,6 +219,7 @@
   appNotificationHandlerMojom,
   crosAudioConfigMojom,
   fakeCrosAudioConfig,
+  nearbyShareMojom,
   personalizationSearchMojom,
   routesMojomWebui,
   searchMojomWebui,
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_dialog.ts b/chrome/browser/resources/settings/performance_page/tab_discard_exception_dialog.ts
index 62987c9..02985c6 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_dialog.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_dialog.ts
@@ -117,6 +117,10 @@
     }
     // add dialog
     this.appendPrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, this.rule_);
+    this.dispatchEvent(new CustomEvent('add-exception', {
+      bubbles: true,
+      composed: true,
+    }));
     this.metricsProxy_.recordExceptionListAction(
         HighEfficiencyModeExceptionListAction.ADD);
   }
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.html b/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.html
index 2ca922a..cd00756 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.html
+++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.html
@@ -13,17 +13,16 @@
     padding-inline-end: 8px;
   }
 </style>
-<div class="list-item" focus-row-container>
+<div class="list-item">
   <div class="start text-elide">[[entry.site]]</div>
   <template is="dom-if" if="[[entry.managed]]">
-    <cr-policy-pref-indicator focus-row-control focus-type="policy"
+    <cr-policy-pref-indicator
         pref="[[prefs.performance_tuning.tab_discarding.exceptions_managed]]"
         on-mouseenter="onShowTooltip_" on-focus="onShowTooltip_">
     </cr-policy-pref-indicator>
   </template>
   <template is="dom-if" if="[[!entry.managed]]">
-    <cr-icon-button focus-row-control focus-type="menu"
-        class="icon-more-vert" title="$i18n{moreActions}"
+    <cr-icon-button class="icon-more-vert" title="$i18n{moreActions}"
         on-click="onMenuClick_" aria-label="$i18n{moreActions}">
     </cr-icon-button>
   </template>
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.ts b/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.ts
index c2cf1518..f71924f4 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_entry.ts
@@ -8,7 +8,6 @@
 import '../settings_shared.css.js';
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {FocusRowMixin} from 'chrome://resources/js/focus_row_mixin.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BaseMixin} from '../base_mixin.js';
@@ -20,8 +19,7 @@
   managed: boolean;
 }
 
-const TabDiscardExceptionEntryElementBase =
-    FocusRowMixin(BaseMixin(PolymerElement));
+const TabDiscardExceptionEntryElementBase = BaseMixin(PolymerElement);
 
 export class TabDiscardExceptionEntryElement extends
     TabDiscardExceptionEntryElementBase {
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html
index ef755433..9a23467 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html
+++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html
@@ -7,8 +7,14 @@
     padding-inline-start: var(--cr-section-indent-width);
   }
 
-  #outer {
-    max-height: 250px;
+  #outer > tab-discard-exception-entry:not(:first-of-type) {
+    border-top: var(--cr-separator-line);
+  }
+
+  #expandButton {
+    padding-inline-end: 0;
+    padding-inline-start: 0;
+    --cr-icon-button-margin-end: 0;
   }
 </style>
 <div class="cr-row first">
@@ -21,20 +27,31 @@
 <div id="noSitesAdded" class="list-frame" hidden$="[[hasSites_(siteList_.*)]]">
   <div class="list-item secondary">$i18n{noSitesAdded}</div>
 </div>
-<div id="outer" class="layout vertical list-frame">
-  <div id="container" class="scroll-container" scrollable>
-    <iron-list id="list" items="[[siteList_]]" scroll-target="container"
-        preserve-focus risk-selection class="cr-separators">
-      <template>
+<div id="outer" class="layout vertical list-frame" role="list"
+    hidden$="[[!hasSites_(siteList_.*)]]">
+  <template is="dom-repeat" id="list" items="[[getSiteList_(siteList_.*)]]">
+    <tab-discard-exception-entry prefs="[[prefs]]" entry="[[item]]"
+        role="listitem"
+        on-menu-click="onMenuClick_" on-show-tooltip="onShowTooltip_">
+    </tab-discard-exception-entry>
+  </template>
+  <cr-expand-button id="expandButton" no-hover class="hr"
+      hidden$="[[!hasOverflowSites_(siteList_.*)]]"
+      expanded="{{overflowSiteListExpanded}}">
+    <div>$i18n{tabDiscardingExceptionsAdditionalSites}</div>
+  </cr-expand-button>
+  <iron-collapse id="collapse" hidden$="[[!hasOverflowSites_(siteList_.*)]]"
+      opened="[[overflowSiteListExpanded]]">
+    <template is="dom-repeat" id="overflowList"
+        items="[[getOverflowSiteList_(siteList_.*)]]">
+      <div class="hr">
         <tab-discard-exception-entry prefs="[[prefs]]" entry="[[item]]"
-            first$="[[!index]]" focus-row-index="[[index]]"
-            tabindex$="[[tabIndex]]" iron-list-tab-index="[[tabIndex]]"
-            last-focused="{{lastFocused_}}" list-blurred="{{listBlurred_}}"
+            role="listitem"
             on-menu-click="onMenuClick_" on-show-tooltip="onShowTooltip_">
         </tab-discard-exception-entry>
-      </template>
-    </iron-list>
-  </div>
+      </div>
+    </template>
+  </iron-collapse>
 </div>
 <paper-tooltip id="tooltip"
     fit-to-visible-bounds manual-mode position="top">
@@ -55,7 +72,8 @@
   </template>
 </cr-lazy-render>
 <template is="dom-if" if="[[showDialog_]]" restamp>
-  <tab-discard-exception-dialog rule-to-edit="[[selectedRule_]]"
-      prefs="{{prefs}}" on-close="onDialogClose_">
+  <tab-discard-exception-dialog prefs="{{prefs}}"
+      rule-to-edit="[[selectedRule_]]"
+      on-close="onDialogClose_" on-add-exception="onAddException_">
   </tab-discard-exception-dialog>
 </template>
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts
index aa46671d..40f2518 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts
@@ -4,9 +4,10 @@
 
 import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.js';
 import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
-import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
+import 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 import '../settings_shared.css.js';
 import './tab_discard_exception_dialog.js';
@@ -14,26 +15,31 @@
 
 import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js';
+import {CrExpandButtonElement} from 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.js';
 import {CrLazyRenderElement} from 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.js';
-import {CrScrollableMixin, CrScrollableMixinInterface} from 'chrome://resources/cr_elements/cr_scrollable_mixin.js';
 import {ListPropertyUpdateMixin, ListPropertyUpdateMixinInterface} from 'chrome://resources/cr_elements/list_property_update_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
+import {IronCollapseElement} from 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import {PaperTooltipElement} from 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {DomRepeat, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
 import {TooltipMixin, TooltipMixinInterface} from '../tooltip_mixin.js';
 
 import {HighEfficiencyModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from './performance_metrics_proxy.js';
-import {TAB_DISCARD_EXCEPTIONS_PREF, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF} from './tab_discard_exception_dialog.js';
+import {TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_PREF} from './tab_discard_exception_dialog.js';
 import {TabDiscardExceptionEntry} from './tab_discard_exception_entry.js';
 import {getTemplate} from './tab_discard_exception_list.html.js';
 
+export const TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE: number = 5;
+
 export interface TabDiscardExceptionListElement {
   $: {
     addButton: CrButtonElement,
-    list: IronListElement,
+    collapse: IronCollapseElement,
+    expandButton: CrExpandButtonElement,
+    list: DomRepeat,
+    overflowList: DomRepeat,
     menu: CrLazyRenderElement<CrActionMenuElement>,
     noSitesAdded: HTMLElement,
     tooltip: PaperTooltipElement,
@@ -42,11 +48,9 @@
 
 type Constructor<T> = new (...args: any[]) => T;
 const TabDiscardExceptionListElementBase =
-    TooltipMixin(CrScrollableMixin(
-        ListPropertyUpdateMixin(PrefsMixin(PolymerElement)))) as
-    Constructor<TooltipMixinInterface&CrScrollableMixinInterface&
-                ListPropertyUpdateMixinInterface&PrefsMixinInterface&
-                PolymerElement>;
+    TooltipMixin(ListPropertyUpdateMixin(PrefsMixin(PolymerElement))) as
+    Constructor<TooltipMixinInterface&ListPropertyUpdateMixinInterface&
+                PrefsMixinInterface&PolymerElement>;
 
 export class TabDiscardExceptionListElement extends
     TabDiscardExceptionListElementBase {
@@ -60,14 +64,13 @@
 
   static get properties() {
     return {
-      lastFocused_: Object,
-      listBlurred_: Boolean,
-
       siteList_: {
         type: Array,
         value: [],
       },
 
+      overflowSiteListExpanded: {type: Boolean, value: false},
+
       /**
        * Rule corresponding to the last more actions menu opened. Indicates to
        * this element and its dialog which rule to edit or if a new one should
@@ -91,13 +94,11 @@
     return [
       `onPrefsChanged_(prefs.${TAB_DISCARD_EXCEPTIONS_PREF}.value.*,` +
           `prefs.${TAB_DISCARD_EXCEPTIONS_MANAGED_PREF}.value.*)`,
-      'onSiteListChanged_(siteList_.*)',
     ];
   }
 
-  private lastFocused_: HTMLElement|null;
-  private listBlurred_: boolean;
   private siteList_: TabDiscardExceptionEntry[];
+  private overflowSiteListExpanded: boolean;
   private selectedRule_: string;
   private showDialog_: boolean;
   private tooltipText_: string;
@@ -109,6 +110,18 @@
     return this.siteList_.length > 0;
   }
 
+  private hasOverflowSites_() {
+    return this.siteList_.length > TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE;
+  }
+
+  private getSiteList_() {
+    return this.siteList_.slice(0, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE);
+  }
+
+  private getOverflowSiteList_() {
+    return this.siteList_.slice(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE);
+  }
+
   private onAddClick_() {
     this.selectedRule_ = '';
     this.showDialog_ = true;
@@ -126,10 +139,6 @@
     this.$.menu.get().close();
   }
 
-  private onDialogClose_() {
-    this.showDialog_ = false;
-  }
-
   private onDeleteClick_() {
     this.deletePrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, this.selectedRule_);
     this.metricsProxy_.recordExceptionListAction(
@@ -137,6 +146,14 @@
     this.$.menu.get().close();
   }
 
+  private onDialogClose_() {
+    this.showDialog_ = false;
+  }
+
+  private onAddException_() {
+    this.overflowSiteListExpanded = true;
+  }
+
   private onPrefsChanged_() {
     const newSites: TabDiscardExceptionEntry[] = [];
     for (const pref
@@ -157,11 +174,6 @@
         'siteList_', (entry: TabDiscardExceptionEntry) => entry.site, newSites);
   }
 
-  private onSiteListChanged_() {
-    // This will fire an iron-resize event causing the list to resize
-    this.updateScrollableContents();
-  }
-
   /**
    * Need to use common tooltip since the tooltip in the entry is cut off from
    * the iron-list.
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts
index edddf49..553294a7 100644
--- a/chrome/browser/resources/settings/settings.ts
+++ b/chrome/browser/resources/settings/settings.ts
@@ -63,7 +63,7 @@
 export {HIGH_EFFICIENCY_MODE_PREF, SettingsPerformancePageElement} from './performance_page/performance_page.js';
 export {MAX_TAB_DISCARD_EXCEPTION_RULE_LENGTH, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_PREF, TabDiscardExceptionDialogElement} from './performance_page/tab_discard_exception_dialog.js';
 export {TabDiscardExceptionEntryElement} from './performance_page/tab_discard_exception_entry.js';
-export {TabDiscardExceptionListElement} from './performance_page/tab_discard_exception_list.js';
+export {TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TabDiscardExceptionListElement} from './performance_page/tab_discard_exception_list.js';
 export {prefToString, stringToPrefValue} from './prefs/pref_util.js';
 export {SettingsPrefsElement} from './prefs/prefs.js';
 export {PrefsMixin, PrefsMixinInterface} from './prefs/prefs_mixin.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/BUILD.gn b/chrome/browser/resources/side_panel/bookmarks/BUILD.gn
index f1731ab..a746362e 100644
--- a/chrome/browser/resources/side_panel/bookmarks/BUILD.gn
+++ b/chrome/browser/resources/side_panel/bookmarks/BUILD.gn
@@ -61,7 +61,7 @@
     "//ui/webui/resources/cr_components/color_change_listener:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_path_mappings =
       [ "chrome://bookmarks-side-panel.top-chrome/shared/*|" +
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
index 0c8b4a97..04ba9123 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -1,4 +1,4 @@
-<style include="cr-icons cr-hidden-style">
+<style include="cr-icons cr-hidden-style sp-shared-style">
   :host {
     --cr-dialog-width: 300px;
     --back-button-size: 14px;
@@ -28,6 +28,11 @@
     width: auto;
   }
 
+  :host-context([chrome-refresh-2023]) cr-toolbar-search-field {
+    margin: var(--sp-body-padding);
+    margin-block-end: 0;
+  }
+
   iron-icon {
     --icon-size: 16px;
     height: var(--icon-size);
@@ -38,6 +43,12 @@
     visibility: hidden;
   }
 
+  :host-context([chrome-refresh-2023]) .sp-card {
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+
   .bookmarks {
     height: inherit;
     overflow-y: auto;
@@ -86,6 +97,10 @@
     margin: 0 14px;
   }
 
+  :host-context([chrome-refresh-2023]) .label-row {
+    margin: var(--sp-card-gap) var(--sp-body-padding);
+  }
+
   cr-toolbar-selection-overlay {
     --cr-toolbar-selection-overlay-padding: 16px;
     background: var(--edit-footer-background);
@@ -124,70 +139,75 @@
       </sp-filter-chip>
     </template>
   </div>
-  <sp-heading hidden$="[[guestMode_]]"
-      back-button-label="Test test test"
-      on-back-button-click="onBackClicked_"
-      hide-back-button="[[!activeFolderPath_.length]]"
-      disable-back-button="[[disableBackButton_(
-          activeFolderPath_.*, editing_)]]">
-    <h1 slot="heading">[[getActiveFolderLabel_(activeFolderPath_.*)]]</h1>
 
-    <cr-button slot="buttons" class="sort-menu-button"
-        aria-label="$i18n{sortMenuA11yLabel}"
-        on-click="onShowSortMenuClicked_">
-      [[getSortLabel_(activeSortIndex_)]]
-      <iron-icon icon="sp:filter-list"></iron-icon>
-    </cr-button>
-    <cr-icon-button slot="buttons" iron-icon="bookmarks:create-new-folder"
-        disabled="[[editing_]]"
-        aria-label="$i18n{createNewFolderA11yLabel}"
-        on-click="onAddNewFolderClicked_"></cr-icon-button>
-    <cr-icon-button slot="buttons" class="icon-edit"
-        disabled="[[!shownBookmarks_.length]]"
-        aria-label="$i18n{editBookmarkListA11yLabel}"
-        aria-pressed="[[editing_]]"
-        aria-disabled="[[!shownBookmarks_.length]]"
-        on-click="onBulkEditClicked_"></cr-icon-button>
-  </sp-heading>
+  <div class="sp-card">
+    <sp-heading hidden$="[[guestMode_]]"
+        back-button-label="Test test test"
+        on-back-button-click="onBackClicked_"
+        hide-back-button="[[!activeFolderPath_.length]]"
+        disable-back-button="[[disableBackButton_(
+            activeFolderPath_.*, editing_)]]">
+      <h1 slot="heading">[[getActiveFolderLabel_(activeFolderPath_.*)]]</h1>
 
-  <div id="bookmarks" class="bookmarks" hidden="[[!shownBookmarks_.length]]"
-      role="[[getBookmarksListRole_(editing_)]]"
-      aria-multiselectable="[[editing_]]">
-    <iron-list id="shownBookmarksIronList"
-        items="[[shownBookmarks_]]" scroll-target="bookmarks">
-      <template>
-        <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]"
-            description="[[getBookmarkDescription_(item,
-                            compactDescriptions_.*, expandedDescriptions_.*,
-                            compact_)]]"
-            compact="[[compact_]]" trailing-icon="cr:more-vert"
-            trailing-icon-aria-label="TODO"
-            has-checkbox="[[editing_]]"
-            checkbox-disabled="[[!canEdit_(item)]]"
-            has-input="[[renamingItem_(item.id, renamingId_)]]"
-            on-row-clicked="onRowClicked_"
-            on-context-menu="onShowContextMenuClicked_"
-            on-trailing-icon-clicked="onShowContextMenuClicked_"
-            on-checkbox-change="onRowSelectedChange_"
-            on-input-change="onRename_">
-          <div slot="badges">
-            <template is="dom-if"
-                if="[[isPriceTracked(item, trackedProductInfos_.*)]]" restamp>
-              <sp-list-item-badge updated="[[showDiscountedPrice_(
-                                             item, trackedProductInfos_.*)]]">
-                <iron-icon icon="bookmarks:price-tracking"></iron-icon>
-                <div>[[getCurrentPrice_(item, trackedProductInfos_.*)]]</div>
-                <div slot="previous-badge"
-                    hidden$="[[!showDiscountedPrice_(
-                                item, trackedProductInfos_.*)]]">
-                  [[getPreviousPrice_(item, trackedProductInfos_.*)]]
-                </div>
-              </sp-list-item-badge>
-            </template>
-          </div>
-        </power-bookmark-row>
-      </template>
-    </iron-list>
+      <cr-button slot="buttons" class="sort-menu-button"
+          aria-label="$i18n{sortMenuA11yLabel}"
+          on-click="onShowSortMenuClicked_">
+        [[getSortLabel_(activeSortIndex_)]]
+        <iron-icon icon="sp:filter-list"></iron-icon>
+      </cr-button>
+      <cr-icon-button slot="buttons" iron-icon="bookmarks:create-new-folder"
+          disabled="[[editing_]]"
+          aria-label="$i18n{createNewFolderA11yLabel}"
+          on-click="onAddNewFolderClicked_"></cr-icon-button>
+      <cr-icon-button slot="buttons" class="icon-edit"
+          disabled="[[!shownBookmarks_.length]]"
+          aria-label="$i18n{editBookmarkListA11yLabel}"
+          aria-pressed="[[editing_]]"
+          aria-disabled="[[!shownBookmarks_.length]]"
+          on-click="onBulkEditClicked_"></cr-icon-button>
+    </sp-heading>
+
+    <div id="bookmarks" class="bookmarks" hidden="[[!shownBookmarks_.length]]"
+        role="[[getBookmarksListRole_(editing_)]]"
+        aria-multiselectable="[[editing_]]">
+      <iron-list id="shownBookmarksIronList"
+          items="[[shownBookmarks_]]" scroll-target="bookmarks">
+        <template>
+          <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]"
+              description="[[getBookmarkDescription_(item,
+                              compactDescriptions_.*, expandedDescriptions_.*,
+                              compact_)]]"
+              compact="[[compact_]]" trailing-icon="cr:more-vert"
+              trailing-icon-aria-label="TODO"
+              has-checkbox="[[editing_]]"
+              checkbox-disabled="[[!canEdit_(item)]]"
+              has-input="[[renamingItem_(item.id, renamingId_)]]"
+              on-row-clicked="onRowClicked_"
+              on-context-menu="onShowContextMenuClicked_"
+              on-trailing-icon-clicked="onShowContextMenuClicked_"
+              on-checkbox-change="onRowSelectedChange_"
+              on-input-change="onRename_">
+            <div slot="badges">
+              <template is="dom-if" restamp
+                  if="[[isPriceTracked(item, trackedProductInfos_.*)]]">
+                <sp-list-item-badge updated="[[showDiscountedPrice_(
+                      item, trackedProductInfos_.*)]]">
+                  <iron-icon icon="bookmarks:price-tracking"></iron-icon>
+                  <div>
+                    [[getCurrentPrice_(item, trackedProductInfos_.*)]]
+                  </div>
+                  <div slot="previous-badge"
+                      hidden$="[[!showDiscountedPrice_(
+                                  item, trackedProductInfos_.*)]]">
+                    [[getPreviousPrice_(item, trackedProductInfos_.*)]]
+                  </div>
+                </sp-list-item-badge>
+              </template>
+            </div>
+          </power-bookmark-row>
+        </template>
+      </iron-list>
+    </div>
   </div>
 
   <sp-empty-state
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
index c3c3e4a..789aa1f5 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -15,6 +15,7 @@
 import '//bookmarks-side-panel.top-chrome/shared/sp_heading.js';
 import '//bookmarks-side-panel.top-chrome/shared/sp_icons.html.js';
 import '//bookmarks-side-panel.top-chrome/shared/sp_list_item_badge.js';
+import '//bookmarks-side-panel.top-chrome/shared/sp_shared_style.css.js';
 import '//resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import '//resources/cr_elements/cr_button/cr_button.js';
 import '//resources/cr_elements/cr_dialog/cr_dialog.js';
diff --git a/chrome/browser/resources/side_panel/customize_chrome/BUILD.gn b/chrome/browser/resources/side_panel/customize_chrome/BUILD.gn
index ef31537..51e03b5 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/BUILD.gn
+++ b/chrome/browser/resources/side_panel/customize_chrome/BUILD.gn
@@ -53,7 +53,7 @@
     "//ui/webui/resources/cr_components/managed_dialog:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 }
diff --git a/chrome/browser/resources/side_panel/read_anything/BUILD.gn b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
index c72037e3..1a913b6 100644
--- a/chrome/browser/resources/side_panel/read_anything/BUILD.gn
+++ b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
@@ -18,7 +18,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_definitions = [
     "read_anything.d.ts",
diff --git a/chrome/browser/resources/side_panel/reading_list/BUILD.gn b/chrome/browser/resources/side_panel/reading_list/BUILD.gn
index e2b5c14..f763b7b 100644
--- a/chrome/browser/resources/side_panel/reading_list/BUILD.gn
+++ b/chrome/browser/resources/side_panel/reading_list/BUILD.gn
@@ -33,7 +33,7 @@
     "//ui/webui/resources/cr_components/help_bubble:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 }
diff --git a/chrome/browser/resources/side_panel/search_companion/BUILD.gn b/chrome/browser/resources/side_panel/search_companion/BUILD.gn
index 1158c241..0a3d908 100644
--- a/chrome/browser/resources/side_panel/search_companion/BUILD.gn
+++ b/chrome/browser/resources/side_panel/search_companion/BUILD.gn
@@ -21,6 +21,6 @@
   ts_deps = [
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/side_panel/shared/BUILD.gn b/chrome/browser/resources/side_panel/shared/BUILD.gn
index 4bde9cb..d671e19 100644
--- a/chrome/browser/resources/side_panel/shared/BUILD.gn
+++ b/chrome/browser/resources/side_panel/shared/BUILD.gn
@@ -18,6 +18,11 @@
     "sp_list_item_badge.ts",
   ]
 
+  css_files = [
+    "sp_shared_vars.css",
+    "sp_shared_style.css",
+  ]
+
   icons_html_files = [ "sp_icons.html" ]
 
   ts_composite = true
diff --git a/chrome/browser/resources/side_panel/shared/sp_shared_style.css b/chrome/browser/resources/side_panel/shared/sp_shared_style.css
new file mode 100644
index 0000000..f5cdfb86
--- /dev/null
+++ b/chrome/browser/resources/side_panel/shared/sp_shared_style.css
@@ -0,0 +1,25 @@
+/* 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. */
+
+/* #css_wrapper_metadata_start
+ * #type=style
+ * #import=./sp_shared_vars.css.js
+ * #css_wrapper_metadata_end */
+
+.sp-card {
+  display: contents;
+}
+
+:host-context([chrome-refresh-2023]) .sp-card {
+  background: var(--color-side-panel-card-background);
+  border-radius: 12px;
+  display: block;
+  margin: 0 var(--sp-body-padding);
+  padding: var(--sp-card-block-padding) 0;
+}
+
+:host-context([chrome-refresh-2023]) .sp-card sp-heading {
+  margin: 0;
+  padding: 0 var(--sp-card-inline-padding);
+}
diff --git a/chrome/browser/resources/side_panel/shared/sp_shared_vars.css b/chrome/browser/resources/side_panel/shared/sp_shared_vars.css
new file mode 100644
index 0000000..4388d2f6
--- /dev/null
+++ b/chrome/browser/resources/side_panel/shared/sp_shared_vars.css
@@ -0,0 +1,14 @@
+/* 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. */
+
+/* #css_wrapper_metadata_start
+ * #type=vars
+ * #css_wrapper_metadata_end */
+
+html[chrome-refresh-2023] {
+  --sp-body-padding: 8px;
+  --sp-card-block-padding: 8px;
+  --sp-card-inline-padding: 16px;
+  --sp-card-gap: 12px;
+}
diff --git a/chrome/browser/resources/side_panel/user_notes/BUILD.gn b/chrome/browser/resources/side_panel/user_notes/BUILD.gn
index 088c7ab..2c9ac90 100644
--- a/chrome/browser/resources/side_panel/user_notes/BUILD.gn
+++ b/chrome/browser/resources/side_panel/user_notes/BUILD.gn
@@ -32,6 +32,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.html b/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.html
index 752cafed..0227a37e 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.html
+++ b/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.html
@@ -1,7 +1,35 @@
+<style>
+  h2 {
+    font-size: 14px;
+    padding: 0 16px;
+  }
+
+  .hr {
+    border-top: 1px solid var(--google-grey-300);
+    margin: 8px 16px;
+  }
+
+  @media (prefers-color-scheme: dark) {
+    .hr {
+      border-top: 1px solid var(--google-grey-700);
+    }
+  }
+</style>
+
 <template id="noteOverviewsList" is="dom-repeat" items="[[overviews]]"
-    sort="sortByModificationTime_">
+    sort="sortOverviews_">
+  <template is="dom-if"
+      if="[[headerShownBeforeOverview_(index, currentTabHasNotes_)]]" restamp>
+    <sp-heading hide-back-button>
+      <h2 slot="heading">[[getHeader_(index, currentTabHasNotes_)]]</h2>
+    </sp-heading>
+  </template>
   <user-note-overview-row overview="[[item]]" description="[[item.text]]"
       on-row-clicked="onRowClicked_" on-context-menu="onShowContextMenuClicked_"
       on-trailing-icon-clicked="onShowContextMenuClicked_">
   </user-note-overview-row>
+  <template is="dom-if" if="[[shouldShowHr_(item)]]" restamp>
+    <div class="hr">
+  </template>
+  </div>
 </template>
\ No newline at end of file
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.ts b/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.ts
index ef9b008e1..38dff3fb 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.ts
+++ b/chrome/browser/resources/side_panel/user_notes/user_note_overviews_list.ts
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 import './user_note_overview_row.js';
+import '//user-notes-side-panel.top-chrome/shared/sp_heading.js';
 
+import {loadTimeData} from '//resources/js/load_time_data.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './user_note_overviews_list.html.js';
@@ -22,16 +24,48 @@
   static get properties() {
     return {
       overviews: Object,
+
+      currentTabHasNotes_: {
+        computed: 'hasOverviewforCurrentTab_(overviews)',
+        type: Boolean,
+      },
     };
   }
 
   overviews: NoteOverview[];
+  private currentTabHasNotes_: boolean;
 
   private userNotesApi_: UserNotesApiProxy =
       UserNotesApiProxyImpl.getInstance();
 
-  private sortByModificationTime_(
-      overview1: NoteOverview, overview2: NoteOverview): number {
+  private hasOverviewforCurrentTab_(): boolean {
+    return this.overviews.filter(overview => overview.isCurrentTab === true)
+               .length > 0;
+  }
+
+  private headerShownBeforeOverview_(index: number): boolean {
+    return index === 0 || (index === 1 && this.currentTabHasNotes_);
+  }
+
+  private getHeader_(index: number): string {
+    return loadTimeData.getString(
+        (index === 0 && this.currentTabHasNotes_) ? 'currentTab' : 'allNotes');
+  }
+
+  private shouldShowHr_(overview: NoteOverview): boolean {
+    return overview.isCurrentTab && this.overviews.length > 1;
+  }
+
+  private sortOverviews_(overview1: NoteOverview, overview2: NoteOverview):
+      number {
+    // Sort the current tab overview at the top.
+    if (overview1.isCurrentTab) {
+      return -1;
+    }
+    if (overview2.isCurrentTab) {
+      return 1;
+    }
+    // Sort remaining overviews by last modification time.
     return Number(
         overview2.lastModificationTime.internalValue -
         overview1.lastModificationTime.internalValue);
diff --git a/chrome/browser/resources/suggest_internals/BUILD.gn b/chrome/browser/resources/suggest_internals/BUILD.gn
index a0b316ed..82b93ed0 100644
--- a/chrome/browser/resources/suggest_internals/BUILD.gn
+++ b/chrome/browser/resources/suggest_internals/BUILD.gn
@@ -20,6 +20,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/tab_search/BUILD.gn b/chrome/browser/resources/tab_search/BUILD.gn
index 7d56638..d4b82175 100644
--- a/chrome/browser/resources/tab_search/BUILD.gn
+++ b/chrome/browser/resources/tab_search/BUILD.gn
@@ -62,7 +62,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_extra_deps = [
     ":copy_fuse",
diff --git a/chrome/browser/resources/tab_strip/BUILD.gn b/chrome/browser/resources/tab_strip/BUILD.gn
index 9ffd9384..62ec734 100644
--- a/chrome/browser/resources/tab_strip/BUILD.gn
+++ b/chrome/browser/resources/tab_strip/BUILD.gn
@@ -55,6 +55,6 @@
   ts_deps = [
     "//ui/webui/resources/cr_components/color_change_listener:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/resources/usb_internals/BUILD.gn b/chrome/browser/resources/usb_internals/BUILD.gn
index 29dc898..3a4ddb32 100644
--- a/chrome/browser/resources/usb_internals/BUILD.gn
+++ b/chrome/browser/resources/usb_internals/BUILD.gn
@@ -34,7 +34,7 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
   html_to_wrapper_template = "native"
diff --git a/chrome/browser/resources/web_app_internals/BUILD.gn b/chrome/browser/resources/web_app_internals/BUILD.gn
index efc5fcd..c16f98c 100644
--- a/chrome/browser/resources/web_app_internals/BUILD.gn
+++ b/chrome/browser/resources/web_app_internals/BUILD.gn
@@ -23,7 +23,7 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 }
diff --git a/chrome/browser/resources/whats_new/BUILD.gn b/chrome/browser/resources/whats_new/BUILD.gn
index 15bf9c7..208f99e3 100644
--- a/chrome/browser/resources/whats_new/BUILD.gn
+++ b/chrome/browser/resources/whats_new/BUILD.gn
@@ -15,6 +15,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc
index 4e6ffb42..4543999 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.cc
@@ -3,11 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h"
-#include "base/logging.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_number_conversions_win.h"
+
 #include "base/values.h"
 #include "chrome/browser/safe_browsing/extension_telemetry/extension_signal.h"
 #include "components/prefs/pref_service.h"
@@ -19,15 +15,16 @@
 namespace {
 // Default values for the ExtensionTelemetryConfigManager and the
 // string key values for the `configuration_` dict.
-constexpr const uint32_t kDefaultWritesPerInterval = 1u;
-constexpr const uint32_t kDefaultReportingInterval = 3600u;
-constexpr const uint32_t kDefaultConfigVersion = 0u;
-constexpr const uint64_t kDefaultSignalEnables = 0xffffffffffffffff;
-constexpr const char kConfigurationVersion[] = "version";
-constexpr const char kWritesPerInterval[] = "writes_per_interval";
-constexpr const char kReportingInterval[] = "reporting_interval";
-constexpr const char kSignalEnables0[] = "signal_enables_0";
-constexpr const char kSignalEnables1[] = "signal_enables_1";
+constexpr uint32_t kDefaultWritesPerInterval = 1u;
+constexpr uint32_t kDefaultReportingInterval = 3600u;
+constexpr uint32_t kDefaultConfigVersion = 0u;
+constexpr uint32_t kDefaultSignalEnables32 = 0xffffffff;
+constexpr uint64_t kDefaultSignalEnables = 0xffffffffffffffff;
+constexpr char kConfigurationVersion[] = "version";
+constexpr char kWritesPerInterval[] = "writes_per_interval";
+constexpr char kReportingInterval[] = "reporting_interval";
+constexpr char kSignalEnables0[] = "signal_enables_0";
+constexpr char kSignalEnables1[] = "signal_enables_1";
 }  // namespace
 
 ExtensionTelemetryConfigManager::~ExtensionTelemetryConfigManager() = default;
@@ -97,47 +94,45 @@
 bool ExtensionTelemetryConfigManager::IsSignalEnabled(
     const extensions::ExtensionId& extension_id,
     ExtensionSignalType signal_type) const {
-  auto* extension_dict = configuration_.FindDict(extension_id);
+  const base::Value::Dict* extension_dict =
+      configuration_.FindDict(extension_id);
   if (!extension_dict) {
     return true;
   }
-  // Construct the uint64 `signal_enables` bitmask from the uint32_t
-  // `signal_enables_0` and `signal_enables_1` variables.
-  uint64_t signal_enables_bitmask =
-      (static_cast<uint64_t>(*extension_dict->FindInt(kSignalEnables1)) << 32 |
-       static_cast<uint32_t>(*extension_dict->FindInt(kSignalEnables0)));
-  return (signal_enables_bitmask & (1 << (static_cast<int>(signal_type))));
+  uint64_t signal_enables_bitmask = GetSignalEnables(extension_id);
+  return (signal_enables_bitmask &
+          (1ull << (static_cast<uint64_t>(signal_type))));
 }
 
 uint32_t ExtensionTelemetryConfigManager::GetWritesPerInterval() const {
   absl::optional<int> param = configuration_.FindInt(kWritesPerInterval);
-  int value = param.has_value() ? param.value() : kDefaultWritesPerInterval;
-  return static_cast<uint32_t>(value);
+  return static_cast<uint32_t>(param.value_or(kDefaultWritesPerInterval));
 }
 
 uint32_t ExtensionTelemetryConfigManager::GetConfigVersion() const {
   absl::optional<int> param = configuration_.FindInt(kConfigurationVersion);
-  int value = param.has_value() ? param.value() : kDefaultConfigVersion;
-  return static_cast<uint32_t>(value);
+  return static_cast<uint32_t>(param.value_or(kDefaultConfigVersion));
 }
 
 uint32_t ExtensionTelemetryConfigManager::GetReportingInterval() const {
   absl::optional<int> param = configuration_.FindInt(kReportingInterval);
-  int value = param.has_value() ? param.value() : kDefaultReportingInterval;
-  return static_cast<uint32_t>(value);
+  return static_cast<uint32_t>(param.value_or(kDefaultReportingInterval));
 }
 
 uint64_t ExtensionTelemetryConfigManager::GetSignalEnables(
     const extensions::ExtensionId& extension_id) const {
-  auto* extension_dict = configuration_.FindDict(extension_id);
+  const base::Value::Dict* extension_dict =
+      configuration_.FindDict(extension_id);
   if (!extension_dict) {
     // By default, all signals are enabled for extensions.
     return kDefaultSignalEnables;
   }
-  absl::optional<uint64_t> param =
-      (static_cast<uint64_t>(*extension_dict->FindInt(kSignalEnables1)) << 32 |
-       static_cast<uint32_t>(*extension_dict->FindInt(kSignalEnables0)));
-  uint64_t value = param.has_value() ? param.value() : kDefaultSignalEnables;
-  return value;
+  uint32_t signal_enables_0 =
+      static_cast<uint32_t>(extension_dict->FindInt(kSignalEnables0)
+                                .value_or(kDefaultSignalEnables32));
+  uint32_t signal_enables_1 =
+      static_cast<uint32_t>(extension_dict->FindInt(kSignalEnables1)
+                                .value_or(kDefaultSignalEnables32));
+  return static_cast<uint64_t>(signal_enables_1) << 32 | signal_enables_0;
 }
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h
index 6031be0..2a57440 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_CONFIG_MANAGER_H_
 #define CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_CONFIG_MANAGER_H_
 
+#include "base/memory/raw_ptr.h"
 #include "base/values.h"
 #include "extensions/common/extension_id.h"
 
@@ -88,5 +89,7 @@
   // the telemetry config.
   raw_ptr<PrefService> pref_service_;
 };
+
 }  // namespace safe_browsing
+
 #endif  // CHROME_BROWSER_SAFE_BROWSING_EXTENSION_TELEMETRY_EXTENSION_TELEMETRY_CONFIG_MANAGER_H_
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager_unittest.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager_unittest.cc
index 67b83b6..e0c1a38 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_config_manager_unittest.cc
@@ -1,6 +1,7 @@
 // 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/safe_browsing/extension_telemetry/extension_telemetry_config_manager.h"
 
 #include "chrome/browser/safe_browsing/extension_telemetry/extension_signal.h"
@@ -15,37 +16,42 @@
 
 namespace safe_browsing {
 
-static constexpr const uint32_t kMaxUintValue = 0xffffffff;
-static constexpr const uint64_t kMaxUint64Value = 0xffffffffffffffff;
-static constexpr const uint32_t kDefaultReportingInterval = 3600u;
-static constexpr const uint32_t kDefaultWritesPerInterval = 1u;
-static constexpr const uint32_t kDefaultVersion = 0;
-static constexpr const uint32_t kReportingInterval = 500u;
-static constexpr const uint32_t kWritesPerInterval = 4u;
-static constexpr const uint32_t kVersion = 3;
-static constexpr const uint64_t kExtension1SignalEnables = 0x2B;
-static constexpr const uint64_t kExtension2SignalEnables = 0xfffffffffffffff5;
-static constexpr const char kExtension1[] = "extension1";
-static constexpr const char kExtension2[] = "extension2";
+namespace {
+
+constexpr uint32_t kMaxUintValue = 0xffffffff;
+constexpr uint64_t kMaxUint64Value = 0xffffffffffffffff;
+constexpr uint32_t kDefaultReportingInterval = 3600u;
+constexpr uint32_t kDefaultWritesPerInterval = 1u;
+constexpr uint32_t kDefaultVersion = 0;
+constexpr uint32_t kReportingInterval = 500u;
+constexpr uint32_t kWritesPerInterval = 4u;
+constexpr uint32_t kVersion = 3;
+constexpr uint64_t kExtension1SignalEnables = 0x2B;
+constexpr uint64_t kExtension2SignalEnables = 0xfffffffffffffff5;
+constexpr char kExtension1[] = "extension1";
+constexpr char kExtension2[] = "extension2";
+
+}  // namespace
 
 class ExtensionTelemetryConfigManagerTest : public ::testing::Test {
  protected:
   ExtensionTelemetryConfigManagerTest();
+
   void SetUp() override { ASSERT_NE(config_manager_, nullptr); }
 
   void ReloadConfig();
   void InitConfig();
   void InitConfigWithMaxValues();
+
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile_;
   std::unique_ptr<ExtensionTelemetryConfigManager> config_manager_;
 };
 
 ExtensionTelemetryConfigManagerTest::ExtensionTelemetryConfigManagerTest()
-    : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
-  config_manager_ =
-      std::make_unique<ExtensionTelemetryConfigManager>(profile_.GetPrefs());
-}
+    : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
+      config_manager_(std::make_unique<ExtensionTelemetryConfigManager>(
+          profile_.GetPrefs())) {}
 
 void ExtensionTelemetryConfigManagerTest::InitConfigWithMaxValues() {
   ExtensionTelemetryReportResponse::Configuration config;
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.cc b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.cc
index 202d3077..3ac1299 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.cc
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.cc
@@ -370,13 +370,13 @@
   pref_change_registrar_.RemoveAll();
 }
 
-bool ExtensionTelemetryService::SignalDataPresent() {
+bool ExtensionTelemetryService::SignalDataPresent() const {
   return (extension_store_.size() > 0);
 }
 
 bool ExtensionTelemetryService::IsSignalEnabled(
     const extensions::ExtensionId& extension_id,
-    ExtensionSignalType signal_type) {
+    ExtensionSignalType signal_type) const {
   return config_manager_->IsSignalEnabled(extension_id, signal_type);
 }
 
diff --git a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.h b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.h
index 56c7c86..79beac2 100644
--- a/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.h
+++ b/chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_service.h
@@ -39,12 +39,12 @@
 enum class ExtensionSignalType;
 class ExtensionSignal;
 class ExtensionSignalProcessor;
+class ExtensionTelemetryConfigManager;
 class ExtensionTelemetryFileProcessor;
+class ExtensionTelemetryPersister;
 class ExtensionTelemetryReportRequest;
 class ExtensionTelemetryReportRequest_ExtensionInfo;
 class ExtensionTelemetryUploader;
-class ExtensionTelemetryPersister;
-class ExtensionTelemetryConfigManager;
 class SafeBrowsingTokenFetcher;
 
 // This class process extension signals and reports telemetry for a given
@@ -92,7 +92,7 @@
   // Checks the `extension_id` and `signal_type` against the
   // configuration and reports true if the signal should be created.
   bool IsSignalEnabled(const extensions::ExtensionId& extension_id,
-                       ExtensionSignalType signal_type);
+                       ExtensionSignalType signal_type) const;
 
   base::TimeDelta current_reporting_interval() {
     return current_reporting_interval_;
@@ -112,7 +112,7 @@
 
   // Returns a bool that represents if there is any signal processor
   // information to report.
-  bool SignalDataPresent();
+  bool SignalDataPresent() const;
 
   // Creates telemetry report protobuf for all extension store extensions
   // and currently installed extensions along with signal data retrieved from
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc
index e0e1f04f..4df1517 100644
--- a/chrome/browser/speech/speech_recognition_service_browsertest.cc
+++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -370,6 +370,9 @@
   auto bus = media::AudioBus::Create(kExpectedChannelCount,
                                      handler->total_frames_for_testing());
 
+  size_t bytes_written = 0u;
+  ASSERT_TRUE(handler->CopyTo(bus.get(), &bytes_written));
+
   std::vector<int16_t> audio_data(bus->frames());
   bus->ToInterleaved<media::SignedInt16SampleTypeTraits>(bus->frames(),
                                                          audio_data.data());
@@ -423,6 +426,9 @@
   auto bus = media::AudioBus::Create(kExpectedChannelCount,
                                      handler->total_frames_for_testing());
 
+  size_t bytes_written = 0u;
+  ASSERT_TRUE(handler->CopyTo(bus.get(), &bytes_written));
+
   std::vector<int16_t> audio_data(bus->frames());
   bus->ToInterleaved<media::SignedInt16SampleTypeTraits>(bus->frames(),
                                                          audio_data.data());
diff --git a/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc b/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc
index 0c5a082..6748496 100644
--- a/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc
+++ b/chrome/browser/sync_file_system/local/local_file_sync_context_unittest.cc
@@ -437,7 +437,7 @@
       base::SequencedTaskRunner::GetCurrentDefault(), future.GetCallback());
 
   const auto result = future.Take();
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->type, blink::mojom::StorageType::kSyncable);
   EXPECT_GT(result->id.value(), 0);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 016aefa7f..cef8559 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4282,6 +4282,9 @@
       "side_panel/customize_chrome/customize_chrome_tab_helper.h",
       "side_panel/customize_chrome/customize_chrome_utils.cc",
       "side_panel/customize_chrome/customize_chrome_utils.h",
+      "side_panel/history_clusters/history_clusters_side_panel_controller_utils.h",
+      "side_panel/history_clusters/history_clusters_tab_helper.cc",
+      "side_panel/history_clusters/history_clusters_tab_helper.h",
       "views/send_tab_to_self/send_tab_to_self_bubble.cc",
       "views/send_tab_to_self/send_tab_to_self_bubble_controller.cc",
       "views/send_tab_to_self/send_tab_to_self_bubble_controller.h",
@@ -4893,8 +4896,12 @@
       "views/passwords/credential_leak_dialog_view.h",
       "views/passwords/credentials_item_view.cc",
       "views/passwords/credentials_item_view.h",
+      "views/passwords/manage_passwords_details_view.cc",
+      "views/passwords/manage_passwords_details_view.h",
       "views/passwords/manage_passwords_icon_views.cc",
       "views/passwords/manage_passwords_icon_views.h",
+      "views/passwords/manage_passwords_list_view.cc",
+      "views/passwords/manage_passwords_list_view.h",
       "views/passwords/manage_passwords_view.cc",
       "views/passwords/manage_passwords_view.h",
       "views/passwords/move_to_account_store_bubble_view.cc",
@@ -5062,6 +5069,9 @@
       "views/side_panel/extensions/extension_side_panel_manager.h",
       "views/side_panel/feed/feed_side_panel_coordinator.cc",
       "views/side_panel/feed/feed_side_panel_coordinator.h",
+      "views/side_panel/history_clusters/history_clusters_side_panel_controller.cc",
+      "views/side_panel/history_clusters/history_clusters_side_panel_controller.h",
+      "views/side_panel/history_clusters/history_clusters_side_panel_controller_utils.cc",
       "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc",
       "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.h",
       "views/side_panel/read_anything/read_anything_button_view.cc",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
index fe101a59..e9dd62f0 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -192,7 +192,8 @@
                 overrideUrlLoadingDelegate, LocaleManager.getInstance(), templateUrlServiceSupplier,
                 backKeyBehavior, windowAndroid, isTabletWindow() && isTabletLayout(),
                 searchEngineLogoUtils, LensController.getInstance(), launchAssistanceSettingsAction,
-                saveOfflineButtonState, omniboxUma, isToolbarMicEnabledSupplier);
+                saveOfflineButtonState, omniboxUma, isToolbarMicEnabledSupplier,
+                mOmniboxDropdownEmbedderImpl);
         if (backPressManager != null && BackPressManager.isEnabled()) {
             backPressManager.addHandler(mLocationBarMediator, BackPressHandler.Type.LOCATION_BAR);
         }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
index 1de6fb1..33548ea 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
@@ -144,6 +144,9 @@
                 @Override
                 public void setValue(LocationBarMediator object, float value) {
                     ((LocationBarTablet) mLocationBarLayout).setWidthChangeAnimationFraction(value);
+                    if (OmniboxFeatures.shouldShowModernizeVisualUpdate(mContext) && mUrlHasFocus) {
+                        mEmbedderImpl.recalculateOmniboxAlignment();
+                    }
                 }
             };
 
@@ -175,6 +178,7 @@
     private final SearchEngineLogoUtils mSearchEngineLogoUtils;
     private final SaveOfflineButtonState mSaveOfflineButtonState;
     private final OmniboxUma mOmniboxUma;
+    private final OmniboxSuggestionsDropdownEmbedderImpl mEmbedderImpl;
 
     private boolean mNativeInitialized;
     private boolean mUrlFocusedFromFakebox;
@@ -209,7 +213,8 @@
             @NonNull LensController lensController,
             @NonNull Runnable launchAssistanceSettingsAction,
             @NonNull SaveOfflineButtonState saveOfflineButtonState, @NonNull OmniboxUma omniboxUma,
-            @NonNull BooleanSupplier isToolbarMicEnabledSupplier) {
+            @NonNull BooleanSupplier isToolbarMicEnabledSupplier,
+            @NonNull OmniboxSuggestionsDropdownEmbedderImpl dropdownEmbedder) {
         mContext = context;
         mLocationBarLayout = locationBarLayout;
         mLocationBarDataProvider = locationBarDataProvider;
@@ -233,6 +238,7 @@
         mSaveOfflineButtonState = saveOfflineButtonState;
         mOmniboxUma = omniboxUma;
         mIsToolbarMicEnabledSupplier = isToolbarMicEnabledSupplier;
+        mEmbedderImpl = dropdownEmbedder;
     }
 
     /**
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
index 9147cd9..e1b9a95 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
@@ -231,6 +231,8 @@
     private PreloadPagesSettingsBridge.Natives mPreloadPagesSettingsJni;
     @Mock
     private LocationBarMediator.OmniboxUma mOmniboxUma;
+    @Mock
+    private OmniboxSuggestionsDropdownEmbedderImpl mEmbedderImpl;
 
     @Captor
     private ArgumentCaptor<Runnable> mRunnableCaptor;
@@ -269,7 +271,7 @@
                 mLocaleManager, templateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate,
                 mWindowAndroid,
                 /*isTablet=*/false, mSearchEngineLogoUtils, mLensController, noAction,
-                tab -> true, mOmniboxUma, () -> mIsToolbarMicEnabled);
+                tab -> true, mOmniboxUma, () -> mIsToolbarMicEnabled, mEmbedderImpl);
         mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
         ObjectAnimatorShadow.setUrlAnimator(mUrlAnimator);
         GSAStateShadow.setGSAState(mGSAState);
@@ -279,7 +281,9 @@
                 mOverrideUrlLoadingDelegate, mLocaleManager, templateUrlServiceSupplier,
                 mOverrideBackKeyBehaviorDelegate, mWindowAndroid,
                 /*isTablet=*/true, mSearchEngineLogoUtils, mLensController, noAction,
-                tab -> true, (tab, transition, isNtp) -> {}, () -> mIsToolbarMicEnabled);
+                tab
+                -> true,
+                (tab, transition, isNtp) -> {}, () -> mIsToolbarMicEnabled, mEmbedderImpl);
         mTabletMediator.setCoordinators(
                 mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
         ShadowUrlUtilities.sIsNtp = false;
@@ -852,7 +856,7 @@
                 mLocaleManager, templateUrlServiceSupplier, mOverrideBackKeyBehaviorDelegate,
                 mWindowAndroid,
                 /*isTablet=*/false, mSearchEngineLogoUtils, mLensController,
-                () -> {}, tab -> true, mOmniboxUma, () -> mIsToolbarMicEnabled);
+                () -> {}, tab -> true, mOmniboxUma, () -> mIsToolbarMicEnabled, mEmbedderImpl);
         mMediator.setCoordinators(mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
         int primeCount = sGeoHeaderPrimeCount;
         mMediator.addUrlFocusChangeListener(mUrlCoordinator);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java
index 07bb0cd..9bc3bff 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.omnibox;
 
+import android.content.Context;
 import android.view.View;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.view.WindowInsets;
@@ -22,11 +23,7 @@
 
 /**
  * Implementation of {@link OmniboxSuggestionsDropdownEmbedder} that positions it using an "anchor"
- * and "horizontal alignment" view. It aligns the omnibox dropdown as follows:
- * - The top of the dropdown is the bottom of the anchor view.
- * - The width of the dropdown is equal to the anchor view's width.
- * - The horizontal padding of the dropdown is calculated so that its contents are in line with the
- *   horizontal alignment view if the alignment view's width is smaller than the anchor view.
+ * and "horizontal alignment" view.
  * */
 class OmniboxSuggestionsDropdownEmbedderImpl implements OmniboxSuggestionsDropdownEmbedder,
                                                         View.OnLayoutChangeListener,
@@ -37,6 +34,7 @@
     private final @NonNull WindowDelegate mWindowDelegate;
     private final @NonNull View mAnchorView;
     private final @NonNull View mHorizontalAlignmentView;
+    private final @NonNull Context mContext;
     // Reusable int array to pass to positioning methods that operate on a two element int array.
     // Keeping it as a member lets us avoid allocating a temp array every time.
     private final int[] mPositionArray = new int[2];
@@ -61,6 +59,7 @@
         mWindowDelegate = windowDelegate;
         mAnchorView = anchorView;
         mHorizontalAlignmentView = horizontalAlignmentView;
+        mContext = mAnchorView.getContext();
         recalculateOmniboxAlignment();
     }
 
@@ -126,22 +125,48 @@
      * any observers. Currently will send an update message unconditionally. This method is called
      * during layout and should avoid memory allocations other than the necessary new
      * OmniboxAlignment().
+     *  The method aligns the omnibox dropdown as follows:
+     *  Case 1: Omnibox revamp enabled on tablet window.
+     *  | anchor  [  alignment  ]       |
+     *            |  dropdown   |
+     *  Case 2: Omnibox revamp disabled on tablet window.
+     *  | anchor    [alignment]         |
+     *  |{pad_left} dropdown {pad_right}|
+     *  Case 3: Phone window. Full width and no padding.
+     *  | anchor     [alignment]        |
+     *  |           dropdown            |
      */
     void recalculateOmniboxAlignment() {
-        int left = 0;
         View contentView = mAnchorView.getRootView().findViewById(android.R.id.content);
         ViewUtils.getRelativeLayoutPosition(contentView, mAnchorView, mPositionArray);
         int top = mPositionArray[1] + mAnchorView.getMeasuredHeight();
-        int width = mAnchorView.getMeasuredWidth();
+        int left;
+        int width;
         int paddingLeft;
         int paddingRight;
         if (isTablet()) {
             ViewUtils.getRelativeLayoutPosition(
                     mAnchorView, mHorizontalAlignmentView, mPositionArray);
-            paddingLeft = mPositionArray[0];
-            paddingRight = mAnchorView.getMeasuredWidth()
-                    - mHorizontalAlignmentView.getMeasuredWidth() - mPositionArray[0];
+            if (OmniboxFeatures.shouldShowModernizeVisualUpdate(mContext)) {
+                // Case 1: tablets with revamp enabled. Width equal to alignment view and left
+                // equivalent to left of alignment view.
+                left = mPositionArray[0];
+                width = mHorizontalAlignmentView.getMeasuredWidth();
+                paddingLeft = 0;
+                paddingRight = 0;
+            } else {
+                // Case 2: tablets with revamp disabled. Full bleed width with padding to align
+                // suggestions to the alignment view.
+                left = 0;
+                width = mAnchorView.getMeasuredWidth();
+                paddingLeft = mPositionArray[0];
+                paddingRight = mAnchorView.getMeasuredWidth()
+                        - mHorizontalAlignmentView.getMeasuredWidth() - mPositionArray[0];
+            }
         } else {
+            // Case 3: phones. Full bleed width with no padding or positioning adjustments.
+            left = 0;
+            width = mAnchorView.getMeasuredWidth();
             paddingLeft = 0;
             paddingRight = 0;
         }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
index 83b34a5..5a440cd1 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImplTest.java
@@ -18,6 +18,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnit;
@@ -26,7 +27,11 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionsDropdownEmbedder.OmniboxAlignment;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.base.WindowDelegate;
 
@@ -45,6 +50,7 @@
     // probably because you used position[1] instead of position[0].
     private static final int ALIGNMENT_TOP = 43;
 
+    public @Rule TestRule mProcessor = new Features.JUnitProcessor();
     public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule();
 
     private @Mock WindowAndroid mWindowAndroid;
@@ -61,6 +67,7 @@
     public void setUp() {
         mContextWeakRef = new WeakReference<>(ContextUtils.getApplicationContext());
         doReturn(mContextWeakRef).when(mWindowAndroid).getContext();
+        doReturn(mContextWeakRef.get()).when(mAnchorView).getContext();
         doReturn(mViewTreeObserver).when(mAnchorView).getViewTreeObserver();
         doReturn(mContentView).when(mAnchorView).getRootView();
         doReturn(mContentView).when(mContentView).findViewById(android.R.id.content);
@@ -104,6 +111,24 @@
     }
 
     @Test
+    @EnableFeatures({ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE})
+    @CommandLineFlags.
+    Add({"enable-features=" + ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE + "<Study",
+            "force-fieldtrials=Study/Group",
+            "force-fieldtrial-params=Study.Group:enable_modernize_visual_update_on_tablet/true"})
+    public void
+    testRecalculateOmniboxAlignment_phoneRevampEnabled() {
+        OmniboxFeatures.ENABLE_MODERNIZE_VISUAL_UPDATE_ON_TABLET.setForTesting(true);
+        doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent();
+        doReturn(40).when(mHorizontalAlignmentView).getLeft();
+        doReturn(60).when(mHorizontalAlignmentView).getTop();
+        mImpl.recalculateOmniboxAlignment();
+        OmniboxAlignment alignment = mImpl.getCurrentAlignment();
+        assertEquals(
+                new OmniboxAlignment(0, ANCHOR_HEIGHT + ANCHOR_TOP, ANCHOR_WIDTH, 0, 0), alignment);
+    }
+
+    @Test
     @Config(qualifiers = "w600dp-h820dp")
     public void testRecalculateOmniboxAlignment_tablet() {
         doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent();
@@ -114,4 +139,23 @@
                              ANCHOR_WIDTH - ALIGNMENT_WIDTH - 40),
                 alignment);
     }
+
+    @Test
+    @Config(qualifiers = "w600dp-h820dp")
+    @EnableFeatures({ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE})
+    @CommandLineFlags.
+    Add({"enable-features=" + ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE + "<Study",
+            "force-fieldtrials=Study/Group",
+            "force-fieldtrial-params=Study.Group:enable_modernize_visual_update_on_tablet/true"})
+    public void
+    testRecalculateOmniboxAlignment_tabletRevampEnabled() {
+        OmniboxFeatures.ENABLE_MODERNIZE_VISUAL_UPDATE_ON_TABLET.setForTesting(true);
+        doReturn(mAnchorView).when(mHorizontalAlignmentView).getParent();
+        doReturn(40).when(mHorizontalAlignmentView).getLeft();
+        doReturn(60).when(mHorizontalAlignmentView).getTop();
+        mImpl.recalculateOmniboxAlignment();
+        OmniboxAlignment alignment = mImpl.getCurrentAlignment();
+        assertEquals(new OmniboxAlignment(40, ANCHOR_HEIGHT + ANCHOR_TOP, ALIGNMENT_WIDTH, 0, 0),
+                alignment);
+    }
 }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
index b5856ec..423bfed 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -54,7 +54,6 @@
     private final int mStandardBgColor;
     private final int mIncognitoBgColor;
 
-    private final int[] mTempPosition = new int[2];
     private final Rect mTempRect = new Rect();
     private final SuggestionLayoutScrollListener mLayoutScrollListener;
 
@@ -576,8 +575,15 @@
     }
 
     private void adjustHorizontalPosition() {
-        setPadding(mOmniboxAlignment.paddingLeft, getPaddingTop(), mOmniboxAlignment.paddingRight,
-                getPaddingBottom());
+        if (OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext())) {
+            // Set our left edge using translation x. This avoids needing to relayout (like setting
+            // a left margin would) and is less risky than calling View#setLeft(), which is intended
+            // for use by the layout system.
+            setTranslationX(mOmniboxAlignment.left);
+        } else {
+            setPadding(mOmniboxAlignment.paddingLeft, getPaddingTop(),
+                    mOmniboxAlignment.paddingRight, getPaddingBottom());
+        }
     }
 
     public void emitWindowContentChanged() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java
index d2b4771..0d2ca98 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownEmbedder.java
@@ -52,7 +52,7 @@
          * Returns whether the difference from the given alignment object is solely in terms of
          * left or padding.
          */
-        public boolean isOnlyHorizontalDifference(@NonNull OmniboxAlignment other) {
+        public boolean isOnlyHorizontalDifference(@Nullable OmniboxAlignment other) {
             if (other == null) return false;
             return (this.left != other.left
                            || this.paddingLeft != other.paddingLeft
@@ -73,12 +73,12 @@
      */
     void removeAlignmentObserver(Callback<OmniboxAlignment> obs);
 
-    @NonNull
     /**
        Returns the current alignment values, but does not recalculate them. Will not return null
        but may return {@link OmniboxAlignment.UNSPECIFIED} if there is not a currently valid
        alignment.
      */
+    @NonNull
     OmniboxAlignment getCurrentAlignment();
 
     /** Return the delegate used to interact with the Window. */
diff --git a/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc b/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc
index 7265b84b..156104e0 100644
--- a/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc
+++ b/chrome/browser/ui/ash/network/tether_notification_presenter_unittest.cc
@@ -31,8 +31,8 @@
  public:
   class TestNetworkConnect : public NetworkConnect {
    public:
-    TestNetworkConnect() {}
-    ~TestNetworkConnect() override {}
+    TestNetworkConnect() = default;
+    ~TestNetworkConnect() override = default;
 
     std::string network_id_to_connect() { return network_id_to_connect_; }
 
@@ -45,7 +45,7 @@
     void ShowPortalSignin(const std::string& network_id,
                           NetworkConnect::Source source) override {}
     void ConfigureNetworkIdAndConnect(const std::string& network_id,
-                                      const base::Value& shill_properties,
+                                      const base::Value::Dict& shill_properties,
                                       bool shared) override {}
     void CreateConfigurationAndConnect(base::Value::Dict shill_properties,
                                        bool shared) override {}
@@ -63,8 +63,8 @@
   class TestSettingsUiDelegate
       : public TetherNotificationPresenter::SettingsUiDelegate {
    public:
-    TestSettingsUiDelegate() {}
-    ~TestSettingsUiDelegate() override {}
+    TestSettingsUiDelegate() = default;
+    ~TestSettingsUiDelegate() override = default;
 
     Profile* last_profile() { return last_profile_; }
     std::string last_settings_subpage() { return last_settings_subpage_; }
diff --git a/chrome/browser/ui/autofill/autofill_context_menu_manager_unittest.cc b/chrome/browser/ui/autofill/autofill_context_menu_manager_unittest.cc
index f3e7dbc..7ae98b87 100644
--- a/chrome/browser/ui/autofill/autofill_context_menu_manager_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_context_menu_manager_unittest.cc
@@ -12,8 +12,8 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h"
+#include "components/autofill/content/browser/test_content_autofill_client.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/test_autofill_driver.h"
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -27,6 +27,12 @@
 namespace autofill {
 
 namespace {
+
+ContentAutofillDriverFactoryTestApi test_api(
+    ContentAutofillDriverFactory* cadf) {
+  return ContentAutofillDriverFactoryTestApi(cadf);
+}
+
 // Generates a ContextMenuParams for the Autofill context menu options.
 content::ContextMenuParams CreateContextMenuParams(
     absl::optional<autofill::FormRendererId> form_renderer_id = absl::nullopt,
@@ -86,7 +92,13 @@
     pdm->AddProfile(test::GetFullProfile());
     pdm->AddCreditCard(test::GetCreditCard());
 
-    autofill_client_ = std::make_unique<TestAutofillClient>(std::move(pdm));
+    auto autofill_client =
+        std::make_unique<TestContentAutofillClient>(web_contents());
+    autofill_client->set_personal_data_manager(std::move(pdm));
+    autofill_client_ = autofill_client.get();
+    web_contents()->SetUserData(autofill_client_->UserDataKey(),
+                                std::move(autofill_client));
+
     menu_model_ = std::make_unique<ui::SimpleMenuModel>(nullptr);
     render_view_context_menu_ = std::make_unique<TestRenderViewContextMenu>(
         *main_rfh(), content::ContextMenuParams());
@@ -105,7 +117,7 @@
   void TearDown() override {
     autofill_context_menu_manager_.reset();
     render_view_context_menu_.reset();
-    autofill_client_.reset();
+    web_contents()->RemoveUserData(autofill_client_->UserDataKey());
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
@@ -114,14 +126,14 @@
       content::RenderFrameHost* rfh,
       std::unique_ptr<MockAutofillDriver> driver) {
     auto* raw_driver = driver.get();
-    ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-        web_contents(), autofill_client_.get(),
-        ContentAutofillDriverFactory::DriverInitCallback());
-    auto* cadf = ContentAutofillDriverFactory::FromWebContents(web_contents());
-    ContentAutofillDriverFactoryTestApi(cadf).SetDriver(rfh, std::move(driver));
+    test_api(factory()).SetDriver(rfh, std::move(driver));
     return raw_driver;
   }
 
+  ContentAutofillDriverFactory* factory() {
+    return autofill_client_->GetAutofillDriverFactory();
+  }
+
   ui::SimpleMenuModel* menu_model() const { return menu_model_.get(); }
 
   AutofillContextMenuManager* autofill_context_menu_manager() const {
@@ -131,7 +143,7 @@
   MockAutofillDriver* driver() const { return driver_; }
 
  private:
-  std::unique_ptr<TestAutofillClient> autofill_client_;
+  raw_ptr<TestContentAutofillClient> autofill_client_;
   std::unique_ptr<TestRenderViewContextMenu> render_view_context_menu_;
   std::unique_ptr<ui::SimpleMenuModel> menu_model_;
   std::unique_ptr<AutofillContextMenuManager> autofill_context_menu_manager_;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
index e323fede..e35ed13 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
@@ -23,13 +23,14 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h"
 #include "components/autofill/content/browser/content_autofill_driver_test_api.h"
 #include "components/autofill/content/browser/content_autofill_router.h"
 #include "components/autofill/content/browser/content_autofill_router_test_api.h"
+#include "components/autofill/content/browser/test_content_autofill_client.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/browser/ui/popup_item_ids.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
 #include "components/autofill/core/common/aliases.h"
@@ -67,9 +68,22 @@
 namespace autofill {
 namespace {
 
-class MockAutofillClient : public autofill::TestAutofillClient {
+ContentAutofillDriverTestApi test_api(ContentAutofillDriver* cadf) {
+  return ContentAutofillDriverTestApi(cadf);
+}
+
+ContentAutofillRouterTestApi test_api(ContentAutofillRouter* cadf) {
+  return ContentAutofillRouterTestApi(cadf);
+}
+
+ContentAutofillDriverFactoryTestApi test_api(
+    ContentAutofillDriverFactory* cadf) {
+  return ContentAutofillDriverFactoryTestApi(cadf);
+}
+
+class MockAutofillClient : public TestContentAutofillClient {
  public:
-  MockAutofillClient() : prefs_(autofill::test::PrefServiceForTesting()) {}
+  using TestContentAutofillClient::TestContentAutofillClient;
   MockAutofillClient(MockAutofillClient&) = delete;
   MockAutofillClient& operator=(MockAutofillClient&) = delete;
   ~MockAutofillClient() override = default;
@@ -80,7 +94,7 @@
   const PrefService* GetPrefs() const override { return prefs_.get(); }
 
  private:
-  std::unique_ptr<PrefService> prefs_;
+  std::unique_ptr<PrefService> prefs_ = autofill::test::PrefServiceForTesting();
 };
 
 class MockAutofillDriver : public ContentAutofillDriver {
@@ -234,12 +248,15 @@
  public:
   AutofillPopupControllerUnitTest()
       : ChromeRenderViewHostTestHarness(
-            base::test::TaskEnvironment::TimeSource::MOCK_TIME),
-        autofill_client_(std::make_unique<MockAutofillClient>()) {}
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
   ~AutofillPopupControllerUnitTest() override = default;
 
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
+    auto autofill_client = std::make_unique<MockAutofillClient>(web_contents());
+    autofill_client_ = autofill_client.get();
+    web_contents()->SetUserData(autofill_client_->UserDataKey(),
+                                std::move(autofill_client));
     external_delegate_ = CreateExternalDelegate();
     autofill_popup_view_ = std::make_unique<NiceMock<MockAutofillPopupView>>();
     autofill_popup_controller_ = new NiceMock<TestAutofillPopupController>(
@@ -254,28 +271,21 @@
       autofill_popup_controller_->DoHide();
 
     external_delegate_.reset();
-    autofill_driver_.reset();
-    autofill_router_.reset();
+    web_contents()->RemoveUserData(autofill_client_->UserDataKey());
 
     ChromeRenderViewHostTestHarness::TearDown();
   }
 
   virtual std::unique_ptr<NiceMock<MockAutofillExternalDelegate>>
   CreateExternalDelegate() {
-    ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-        web_contents(), autofill_client_.get(),
-        base::BindRepeating(&autofill::BrowserDriverInitHook,
-                            autofill_client_.get(), "en-US"));
-
     // Make sure RenderFrame is created.
     NavigateAndCommit(GURL("about:blank"));
     ContentAutofillDriverFactory* factory =
-        ContentAutofillDriverFactory::FromWebContents(web_contents());
+        autofill_client_->GetAutofillDriverFactory();
     ContentAutofillDriver* driver =
         factory->DriverForFrame(web_contents()->GetPrimaryMainFrame());
     // Fake that |driver| has queried a form.
-    ContentAutofillRouterTestApi(
-        &ContentAutofillDriverTestApi(driver).autofill_router())
+    test_api(&test_api(driver).autofill_router())
         .set_last_queried_source(driver);
     return std::make_unique<NiceMock<MockAutofillExternalDelegate>>(
         static_cast<BrowserAutofillManager*>(driver->autofill_manager()),
@@ -319,10 +329,13 @@
   }
 
  protected:
+  ContentAutofillRouter& autofill_router() {
+    return test_api(autofill_client_->GetAutofillDriverFactory()).router();
+  }
+
+  raw_ptr<MockAutofillClient> autofill_client_;
   autofill::test::AutofillEnvironment autofill_environment_;
-  std::unique_ptr<MockAutofillClient> autofill_client_;
-  std::unique_ptr<ContentAutofillRouter> autofill_router_;
-  std::unique_ptr<NiceMock<MockAutofillDriver>> autofill_driver_;
+  raw_ptr<NiceMock<MockAutofillDriver>> autofill_driver_;
   std::unique_ptr<NiceMock<MockAutofillExternalDelegate>> external_delegate_;
   std::unique_ptr<NiceMock<MockAutofillPopupView>> autofill_popup_view_;
   raw_ptr<NiceMock<TestAutofillPopupController>> autofill_popup_controller_ =
@@ -343,19 +356,21 @@
 
   std::unique_ptr<NiceMock<MockAutofillExternalDelegate>>
   CreateExternalDelegate() override {
-    autofill_router_ = std::make_unique<ContentAutofillRouter>();
-    autofill_driver_ = std::make_unique<NiceMock<MockAutofillDriver>>(
-        web_contents()->GetPrimaryMainFrame(), autofill_router_.get());
+    content::RenderFrameHost* rfh = web_contents()->GetPrimaryMainFrame();
+    auto autofill_driver =
+        std::make_unique<NiceMock<MockAutofillDriver>>(rfh, &autofill_router());
+    autofill_driver_ = autofill_driver.get();
     autofill_driver_->set_autofill_manager(
-        std::make_unique<MockBrowserAutofillManager>(autofill_driver_.get(),
-                                                     autofill_client_.get()));
+        std::make_unique<MockBrowserAutofillManager>(autofill_driver_,
+                                                     autofill_client_));
+    test_api(autofill_client_->GetAutofillDriverFactory())
+        .SetDriver(rfh, std::move(autofill_driver));
     // Fake that |driver| has queried a form.
-    ContentAutofillRouterTestApi(autofill_router_.get())
-        .set_last_queried_source(autofill_driver_.get());
+    test_api(&autofill_router()).set_last_queried_source(autofill_driver_);
     return std::make_unique<NiceMock<MockAutofillExternalDelegate>>(
         static_cast<BrowserAutofillManager*>(
             autofill_driver_->autofill_manager()),
-        autofill_driver_.get());
+        autofill_driver_);
   }
 
  protected:
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 179222f..e29dabc 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -1124,7 +1124,11 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents)
-    : content::WebContentsUserData<ChromeAutofillClient>(*web_contents),
+    : ContentAutofillClient(
+          web_contents,
+          base::BindRepeating(&BrowserDriverInitHook,
+                              this,
+                              g_browser_process->GetApplicationLocale())),
       content::WebContentsObserver(web_contents),
       log_manager_(
           // TODO(crbug.com/928595): Replace the closure with a callback to the
@@ -1190,6 +1194,4 @@
   return base::UTF8ToUTF16(primary_account_info.email);
 }
 
-WEB_CONTENTS_USER_DATA_KEY_IMPL(ChromeAutofillClient);
-
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index f228fb4..64c958e 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/autofill/payments/autofill_error_dialog_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/autofill_progress_dialog_controller_impl.h"
-#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
 #include "components/autofill/core/browser/autofill_download_manager.h"
 #include "components/autofill/core/browser/autofill_driver.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
@@ -28,7 +28,6 @@
 #include "components/signin/public/identity_manager/account_info.h"
 #include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents_observer.h"
-#include "content/public/browser/web_contents_user_data.h"
 
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/fast_checkout/fast_checkout_client.h"
@@ -56,16 +55,28 @@
 // primary main frame.
 // TODO(crbug.com/1351388): During prerendering in MPArch, the autofill client
 // should be attached not to the web contents but the outer-most main frame.
-class ChromeAutofillClient
-    : public AutofillClient,
-      public content::WebContentsUserData<ChromeAutofillClient>,
-      public content::WebContentsObserver
+class ChromeAutofillClient : public ContentAutofillClient,
+                             public content::WebContentsObserver
 #if !BUILDFLAG(IS_ANDROID)
     ,
-      public zoom::ZoomObserver
+                             public zoom::ZoomObserver
 #endif  // !BUILDFLAG(IS_ANDROID)
 {
  public:
+  static ChromeAutofillClient* FromWebContents(
+      content::WebContents* web_contents) {
+    return static_cast<ChromeAutofillClient*>(
+        ContentAutofillClient::FromWebContents(web_contents));
+  }
+
+  static void CreateForWebContents(content::WebContents* contents) {
+    DCHECK(contents);
+    if (!FromWebContents(contents)) {
+      contents->SetUserData(
+          UserDataKey(), base::WrapUnique(new ChromeAutofillClient(contents)));
+    }
+  }
+
   ChromeAutofillClient(const ChromeAutofillClient&) = delete;
   ChromeAutofillClient& operator=(const ChromeAutofillClient&) = delete;
   ~ChromeAutofillClient() override;
@@ -265,8 +276,6 @@
   explicit ChromeAutofillClient(content::WebContents* web_contents);
 
  private:
-  friend class content::WebContentsUserData<ChromeAutofillClient>;
-
   Profile* GetProfile() const;
   bool IsMultipleAccountUser();
   std::u16string GetAccountHolderName();
@@ -308,8 +317,6 @@
 
   // True if and only if the associated web_contents() is currently focused.
   bool has_focus_ = false;
-
-  WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
index 228a6e2..98e1f9b 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -166,6 +166,11 @@
       return l10n_util::GetStringUTF16(
           IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_LOCAL);
     case BubbleType::UPLOAD_SAVE:
+      if (base::FeatureList::IsEnabled(
+              features::kAutofillEnableNewSaveCardBubbleUi)) {
+        return l10n_util::GetStringUTF16(
+            IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V5);
+      }
       return features::ShouldShowImprovedUserConsentForCreditCardSave()
                  ? l10n_util::GetStringUTF16(
                        IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V4)
@@ -189,6 +194,12 @@
   if (current_bubble_type_ != BubbleType::UPLOAD_SAVE)
     return std::u16string();
 
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillEnableNewSaveCardBubbleUi)) {
+    return l10n_util::GetStringUTF16(
+        IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V4);
+  }
+
   if (options_.should_request_name_from_user) {
     return l10n_util::GetStringUTF16(
         IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V3_WITH_NAME);
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h
index 95bd0b1..7e8dc65 100644
--- a/chrome/browser/ui/color/chrome_color_id.h
+++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -313,6 +313,7 @@
   E_CPONLY(kColorSidePanelBadgeBackgroundUpdated) \
   E_CPONLY(kColorSidePanelBadgeForeground) \
   E_CPONLY(kColorSidePanelBadgeForegroundUpdated) \
+  E_CPONLY(kColorSidePanelCardBackground) \
   E_CPONLY(kColorSidePanelContentAreaSeparator) \
   E_CPONLY(kColorSidePanelContentBackground) \
   E_CPONLY(kColorSidePanelFilterChipBorder) \
diff --git a/chrome/browser/ui/color/chrome_color_mixer.cc b/chrome/browser/ui/color/chrome_color_mixer.cc
index 04622a9..9ae44c2a 100644
--- a/chrome/browser/ui/color/chrome_color_mixer.cc
+++ b/chrome/browser/ui/color/chrome_color_mixer.cc
@@ -110,7 +110,7 @@
   mixer[kColorAppMenuHighlightSeverityHigh] = {
       kColorAvatarButtonHighlightSyncError};
   mixer[kColorAppMenuHighlightSeverityMedium] = AdjustHighlightColorForContrast(
-      ui::kColorAlertMediumSeverity, kColorToolbar);
+      ui::kColorAlertMediumSeverityIcon, kColorToolbar);
   mixer[kColorAvatarButtonHighlightNormal] =
       AdjustHighlightColorForContrast(ui::kColorAccent, kColorToolbar);
   mixer[kColorAvatarButtonHighlightSyncError] = AdjustHighlightColorForContrast(
@@ -258,7 +258,7 @@
   mixer[kColorMediaRouterIconActive] =
       PickGoogleColor(ui::kColorAccent, kColorToolbar,
                       color_utils::kMinimumVisibleContrastRatio);
-  mixer[kColorMediaRouterIconWarning] = {ui::kColorAlertMediumSeverity};
+  mixer[kColorMediaRouterIconWarning] = {ui::kColorAlertMediumSeverityIcon};
   mixer[kColorNewTabButtonBackgroundFrameActive] = {
       kColorTabBackgroundInactiveFrameActive};
   mixer[kColorNewTabButtonBackgroundFrameInactive] = {
@@ -288,7 +288,7 @@
   mixer[kColorPaymentsFeedbackTipBorder] = {ui::kColorBubbleFooterBorder};
   mixer[kColorPaymentsFeedbackTipForeground] = {
       ui::kColorLabelForegroundSecondary};
-  mixer[kColorPaymentsFeedbackTipIcon] = {ui::kColorAlertMediumSeverity};
+  mixer[kColorPaymentsFeedbackTipIcon] = {ui::kColorAlertMediumSeverityIcon};
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   mixer[kColorPaymentsGooglePayLogo] = {dark_mode ? SK_ColorWHITE
                                                   : gfx::kGoogleGrey700};
@@ -530,9 +530,10 @@
       kColorToolbarTopSeparatorFrameInactive};
   mixer[kColorTabstripLoadingProgressBackground] = ui::AlphaBlend(
       kColorTabstripLoadingProgressForeground, kColorToolbar, 0x32);
-  // 4.5 matches the default light theme contrast of accent-against-toolbar.
+  // 4.5 and 6.0 approximate the default light and dark theme contrasts of
+  // accent-against-toolbar.
   mixer[kColorTabstripLoadingProgressForeground] =
-      PickGoogleColor(ui::kColorAccent, kColorToolbar, 4.5f);
+      PickGoogleColor(ui::kColorAccent, kColorToolbar, 4.5f, 6.0f);
   mixer[kColorTabstripScrollContainerShadow] =
       ui::SetAlpha(ui::kColorShadowBase, 0x4D);
   mixer[kColorTabThrobber] = {ui::kColorThrobber};
@@ -681,8 +682,9 @@
       color_utils::kMinimumVisibleContrastRatio);
 
   // Apply high contrast recipes if necessary.
-  if (!ShouldApplyHighContrastColors(key))
+  if (!ShouldApplyHighContrastColors(key)) {
     return;
+  }
   mixer[kColorDownloadShelfContentAreaSeparator] = {
       kColorToolbarContentAreaSeparator};
   mixer[kColorInfoBarContentAreaSeparator] = {
diff --git a/chrome/browser/ui/color/material_side_panel_color_mixer.cc b/chrome/browser/ui/color/material_side_panel_color_mixer.cc
index ea8f56a2..e9a61228 100644
--- a/chrome/browser/ui/color/material_side_panel_color_mixer.cc
+++ b/chrome/browser/ui/color/material_side_panel_color_mixer.cc
@@ -14,6 +14,8 @@
                                     const ui::ColorProviderManager::Key& key) {
   ui::ColorMixer& mixer = provider->AddMixer();
   mixer[kColorSidePanelContentBackground] = {ui::kColorSysSurface4};
+  mixer[kColorSidePanelCardBackground] = {ui::kColorSysSurface};
+
   mixer[kColorSidePanelBadgeBackground] = {ui::kColorSysSurfaceVariant};
   mixer[kColorSidePanelBadgeBackgroundUpdated] = {
       ui::kColorSysTertiaryContainer};
diff --git a/chrome/browser/ui/global_error/global_error.cc b/chrome/browser/ui/global_error/global_error.cc
index a0ab5faa..41a2cd32 100644
--- a/chrome/browser/ui/global_error/global_error.cc
+++ b/chrome/browser/ui/global_error/global_error.cc
@@ -32,7 +32,7 @@
           IDR_INPUT_ALERT_MENU));
 #else
   return ui::ImageModel::FromVectorIcon(kBrowserToolsErrorIcon,
-                                        ui::kColorAlertMediumSeverity);
+                                        ui::kColorAlertMediumSeverityIcon);
 #endif
 }
 
diff --git a/chrome/browser/ui/side_panel/history_clusters/OWNERS b/chrome/browser/ui/side_panel/history_clusters/OWNERS
new file mode 100644
index 0000000..f0a1aaa
--- /dev/null
+++ b/chrome/browser/ui/side_panel/history_clusters/OWNERS
@@ -0,0 +1,3 @@
+file://chrome/browser/resources/new_tab_page/OWNERS
+file://components/history_clusters/OWNERS
+mfacey@chromium.org
diff --git a/chrome/browser/ui/side_panel/history_clusters/history_clusters_side_panel_controller_utils.h b/chrome/browser/ui/side_panel/history_clusters/history_clusters_side_panel_controller_utils.h
new file mode 100644
index 0000000..b563e0c
--- /dev/null
+++ b/chrome/browser/ui/side_panel/history_clusters/history_clusters_side_panel_controller_utils.h
@@ -0,0 +1,17 @@
+// 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_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_UTILS_H_
+#define CHROME_BROWSER_UI_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_UTILS_H_
+
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
+
+namespace side_panel::history_clusters {
+
+std::unique_ptr<HistoryClustersTabHelper::Delegate> CreateDelegate(
+    content::WebContents* web_contents);
+
+}  // namespace side_panel::history_clusters
+
+#endif  // CHROME_BROWSER_UI_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_UTILS_H_
diff --git a/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.cc b/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.cc
new file mode 100644
index 0000000..146dbb5
--- /dev/null
+++ b/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.cc
@@ -0,0 +1,28 @@
+// 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/side_panel/history_clusters/history_clusters_tab_helper.h"
+
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_side_panel_controller_utils.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+
+namespace side_panel {
+
+HistoryClustersTabHelper::HistoryClustersTabHelper(
+    content::WebContents* web_contents)
+    : content::WebContentsObserver(web_contents),
+      content::WebContentsUserData<HistoryClustersTabHelper>(*web_contents),
+      delegate_(side_panel::history_clusters::CreateDelegate(web_contents)) {}
+
+HistoryClustersTabHelper::~HistoryClustersTabHelper() = default;
+
+void HistoryClustersTabHelper::ShowJourneysSidePanel(const std::string& query) {
+  DCHECK(delegate_);
+  delegate_->ShowJourneysSidePanel(query);
+}
+
+WEB_CONTENTS_USER_DATA_KEY_IMPL(HistoryClustersTabHelper);
+
+}  // namespace side_panel
diff --git a/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h b/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h
new file mode 100644
index 0000000..aaa47d6
--- /dev/null
+++ b/chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h
@@ -0,0 +1,51 @@
+// 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_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_TAB_HELPER_H_
+#define CHROME_BROWSER_UI_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_TAB_HELPER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace content {
+class WebContents;
+}  // namespace content
+
+namespace side_panel {
+
+class HistoryClustersTabHelper
+    : public content::WebContentsObserver,
+      public content::WebContentsUserData<HistoryClustersTabHelper> {
+ public:
+  class Delegate {
+   public:
+    // Shows the Journeys side panel with `query` pre-populated.
+    virtual void ShowJourneysSidePanel(const std::string& query) = 0;
+
+    virtual ~Delegate() = default;
+  };
+
+  ~HistoryClustersTabHelper() override;
+
+  HistoryClustersTabHelper(const HistoryClustersTabHelper&) = delete;
+  HistoryClustersTabHelper& operator=(const HistoryClustersTabHelper&) = delete;
+
+  // Opens Side Panel to the Journeys UI with the given query.
+  virtual void ShowJourneysSidePanel(const std::string& query);
+
+ protected:
+  explicit HistoryClustersTabHelper(content::WebContents* web_contents);
+
+ private:
+  friend class content::WebContentsUserData<HistoryClustersTabHelper>;
+
+  std::unique_ptr<Delegate> delegate_;
+
+  WEB_CONTENTS_USER_DATA_KEY_DECL();
+};
+
+}  // namespace side_panel
+
+#endif  // CHROME_BROWSER_UI_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_TAB_HELPER_H_
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index f828d8f..d1d8aee3 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -174,6 +174,7 @@
 #include "chrome/browser/ui/search/search_tab_helper.h"
 #include "chrome/browser/ui/side_panel/customize_chrome/customize_chrome_tab_helper.h"
 #include "chrome/browser/ui/side_panel/customize_chrome/customize_chrome_utils.h"
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
 #include "chrome/browser/ui/sync/browser_synced_tab_delegate.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "components/commerce/content/browser/hint/commerce_hint_tab_helper.h"
@@ -309,13 +310,6 @@
   }
 #endif
   autofill::ChromeAutofillClient::CreateForWebContents(web_contents);
-  autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      web_contents,
-      autofill::ChromeAutofillClient::FromWebContents(web_contents),
-      base::BindRepeating(
-          &autofill::BrowserDriverInitHook,
-          autofill::ChromeAutofillClient::FromWebContents(web_contents),
-          g_browser_process->GetApplicationLocale()));
   if (breadcrumbs::IsEnabled())
     BreadcrumbManagerTabHelper::CreateForWebContents(web_contents);
   chrome_browser_net::NetErrorTabHelper::CreateForWebContents(web_contents);
@@ -513,6 +507,9 @@
           CreateForWebContents(web_contents, service);
     }
   }
+  if (base::FeatureList::IsEnabled(ntp_features::kNtpHistoryClustersModule)) {
+    side_panel::HistoryClustersTabHelper::CreateForWebContents(web_contents);
+  }
 #endif
 
 #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
index a668b464..8d24793 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/chrome_app_icon.h"
 #include "chrome/browser/extensions/chrome_app_icon_service.h"
-#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/views/accelerator_table.h"
 #include "chrome/browser/ui/views/extensions/extension_keybinding_registry_views.h"
@@ -25,6 +24,7 @@
 #include "components/zoom/page_zoom.h"
 #include "components/zoom/zoom_controller.h"
 #include "extensions/browser/app_window/app_delegate.h"
+#include "extensions/browser/extension_util.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/base/models/image_model.h"
 #include "ui/gfx/geometry/skia_conversions.h"
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
index efaec77..bc2713c3 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -53,6 +53,27 @@
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/style/typography.h"
 
+namespace {
+
+ui::ImageModel GetProfileAvatar(AccountInfo account_info) {
+  // Get the user avatar icon.
+  gfx::Image account_avatar = account_info.account_image;
+
+  // Check if the avatar is empty, and if so, replace it with a placeholder.
+  if (account_avatar.IsEmpty()) {
+    account_avatar = ui::ResourceBundle::GetSharedInstance().GetImageNamed(
+        profiles::GetPlaceholderAvatarIconResourceID());
+  }
+
+  int avatar_size = views::style::GetLineHeight(
+      views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY);
+
+  return ui::ImageModel::FromImage(profiles::GetSizedAvatarIcon(
+      account_avatar, avatar_size, avatar_size, profiles::SHAPE_CIRCLE));
+}
+
+}  // namespace
+
 namespace autofill {
 
 SaveCardOfferBubbleViews::SaveCardOfferBubbleViews(
@@ -64,11 +85,20 @@
   const LegalMessageLines message_lines = controller->GetLegalMessageLines();
 
   if (!message_lines.empty()) {
-    legal_message_view_ = SetFootnoteView(std::make_unique<LegalMessageView>(
-        message_lines, /*user_email=*/absl::nullopt,
-        /*user_avatar=*/absl::nullopt,
-        base::BindRepeating(&SaveCardOfferBubbleViews::LinkClicked,
-                            base::Unretained(this))));
+    if (base::FeatureList::IsEnabled(
+            features::kAutofillEnableNewSaveCardBubbleUi)) {
+      legal_message_view_ = SetFootnoteView(std::make_unique<LegalMessageView>(
+          message_lines, base::UTF8ToUTF16(controller->GetAccountInfo().email),
+          GetProfileAvatar(controller->GetAccountInfo()),
+          base::BindRepeating(&SaveCardOfferBubbleViews::LinkClicked,
+                              base::Unretained(this))));
+    } else {
+      legal_message_view_ = SetFootnoteView(std::make_unique<LegalMessageView>(
+          message_lines, /*user_email=*/absl::nullopt,
+          /*user_avatar=*/absl::nullopt,
+          base::BindRepeating(&SaveCardOfferBubbleViews::LinkClicked,
+                              base::Unretained(this))));
+    }
     InitFootnoteView(legal_message_view_);
   }
 
@@ -148,13 +178,17 @@
   // Set the header image.
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
 
-  // Ternary operator added for the save card ui experiment where the feature
-  // flag and the experiment selected would determine if the experiment is
-  // active or not. Currently, any option != 0 and experiment flag enabled
-  // should trigger the experiment.
   auto image_view = std::make_unique<ThemeTrackingNonAccessibleImageView>(
-      *bundle.GetImageSkiaNamed(IDR_SAVE_CARD),
-      *bundle.GetImageSkiaNamed(IDR_SAVE_CARD_DARK),
+      *bundle.GetImageSkiaNamed(
+          base::FeatureList::IsEnabled(
+              features::kAutofillEnableNewSaveCardBubbleUi)
+              ? IDR_SAVE_CARD_SECURELY
+              : IDR_SAVE_CARD),
+      *bundle.GetImageSkiaNamed(
+          base::FeatureList::IsEnabled(
+              features ::kAutofillEnableNewSaveCardBubbleUi)
+              ? IDR_SAVE_CARD_SECURELY_DARK
+              : IDR_SAVE_CARD_DARK),
       base::BindRepeating(&views::BubbleDialogDelegate::GetBackgroundColor,
                           base::Unretained(this)));
   GetBubbleFrameView()->SetHeaderView(std::move(image_view));
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
index f10e421a..d424d09 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
@@ -199,12 +199,6 @@
   }
 }
 
-void DownloadBubbleRowView::OnThemeChanged() {
-  views::View::OnThemeChanged();
-  secondary_label_->SetEnabledColor(
-      GetColorProvider()->GetColor(ui_info_.secondary_color));
-}
-
 void DownloadBubbleRowView::OnDeviceScaleFactorChanged(
     float old_device_scale_factor,
     float new_device_scale_factor) {
@@ -698,8 +692,7 @@
   }
 
   if (GetWidget()) {
-    secondary_label_->SetEnabledColor(
-        GetColorProvider()->GetColor(ui_info_.secondary_color));
+    secondary_label_->SetEnabledColorId(ui_info_.GetColorForSecondaryText());
   }
 }
 
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.h b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.h
index 53d2572..cfa99b8 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.h
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.h
@@ -53,7 +53,6 @@
   // Overrides views::View:
   void AddedToWidget() override;
   void RemovedFromWidget() override;
-  void OnThemeChanged() override;
   void Layout() override;
   Views GetChildrenInZOrder() override;
   bool OnMouseDragged(const ui::MouseEvent& event) override;
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc
index a1531c67..57d13ac 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc
@@ -254,7 +254,6 @@
     bubble_delegate_->SetCancelCallback(std::move(callback));
     bubble_delegate_->SetButtonEnabled(button_type, !has_checkbox);
     views::LabelButton* button = bubble_delegate_->GetCancelButton();
-    button->SetEnabledTextColorReadabilityAdjustment(true);
     button->SetEnabledTextColors(color);
     secondary_button_ = button;
   } else {
@@ -283,7 +282,7 @@
     UpdateButton(ui_info.subpage_buttons[0], /*is_secondary_button=*/false,
                  ui_info.has_checkbox,
                  GetColorProvider()->GetColor(
-                     download_row_view_->ui_info().secondary_color));
+                     download_row_view_->ui_info().GetColorForSecondaryText()));
   }
 
   if (ui_info.subpage_buttons.size() > 1) {
@@ -292,7 +291,7 @@
     UpdateButton(ui_info.subpage_buttons[1], /*is_secondary_button=*/true,
                  ui_info.has_checkbox,
                  GetColorProvider()->GetColor(
-                     download_row_view_->ui_info().secondary_color));
+                     download_row_view_->ui_info().GetColorForSecondaryText()));
   }
 }
 
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index 1577a55..a9e31dc 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -1001,7 +1001,7 @@
 
   const int non_error_icon_size = 27;
   const auto kWarning = ui::ImageModel::FromVectorIcon(
-      vector_icons::kWarningIcon, ui::kColorAlertMediumSeverity,
+      vector_icons::kWarningIcon, ui::kColorAlertMediumSeverityIcon,
       non_error_icon_size);
   const auto kError = ui::ImageModel::FromVectorIcon(
       vector_icons::kErrorIcon, ui::kColorAlertHighSeverity, 24);
diff --git a/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc
index 9adf079f..3481025 100644
--- a/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_friction_dialog_view.cc
@@ -181,7 +181,7 @@
 // override
 ui::ImageModel ExtensionInstallFrictionDialogView::GetWindowIcon() {
   return ui::ImageModel::FromVectorIcon(
-      vector_icons::kGppMaybeIcon, ui::kColorAlertMediumSeverity,
+      vector_icons::kGppMaybeIcon, ui::kColorAlertMediumSeverityIcon,
       extension_misc::EXTENSION_ICON_SMALLISH);
 }
 
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux.cc b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux.cc
index 7dc44fcc5..89e96d6 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/views/frame/browser_frame_view_linux.h"
 #include "chrome/browser/ui/views/frame/browser_frame_view_paint_utils_linux.h"
+#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
 
 namespace {
 
@@ -44,6 +45,13 @@
 }
 
 gfx::Insets BrowserFrameViewLayoutLinux::RestoredFrameBorderInsets() const {
+  // Borderless mode only has a minimal frame to be able to resize it from the
+  // borders.
+  if (delegate_->GetBorderlessModeEnabled()) {
+    return gfx::Insets(
+        OpaqueBrowserFrameViewLayout::RestoredFrameBorderInsets());
+  }
+
   return GetRestoredFrameBorderInsetsLinux(
       delegate_->ShouldDrawRestoredFrameShadow(),
       OpaqueBrowserFrameViewLayout::RestoredFrameBorderInsets(),
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc
index a0dd4aea7..967bfab 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ui/views/frame/browser_frame_view_layout_linux_native.h"
+#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
 
 #include "ui/linux/nav_button_provider.h"
 
@@ -25,6 +26,13 @@
 
 gfx::Insets BrowserFrameViewLayoutLinuxNative::RestoredFrameBorderInsets()
     const {
+  // Borderless mode only has a minimal frame to be able to resize it from the
+  // borders.
+  if (delegate_->GetBorderlessModeEnabled()) {
+    return gfx::Insets(
+        OpaqueBrowserFrameViewLayout::RestoredFrameBorderInsets());
+  }
+
   const auto insets = window_frame_provider_->GetFrameThicknessDip();
   const auto tiled_edges = delegate_->GetTiledEdges();
   return gfx::Insets::TLBR(tiled_edges.top ? 0 : insets.top(),
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
index 95bfe52..f8cc223 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc
@@ -38,12 +38,18 @@
   auto* linux_ui_theme = ui::LinuxUiTheme::GetForProfile(profile);
   auto* theme_service_factory = ThemeServiceFactory::GetForProfile(profile);
   auto* app_controller = browser_view->browser()->app_controller();
+
   // Ignore the toolkit theme for web apps with window-controls-overlay as the
   // display_override so the web contents can blend with the overlay by using
   // the developer-provided theme color for a better experience. Context:
-  // https://crbug.com/1219073.
+  // https://crbug.com/1219073. Also ignore the toolkit theme for web apps with
+  // borderless as there's no surface left to apply the theme for.
+  bool app_uses_wco_or_borderless =
+      app_controller && (app_controller->AppUsesWindowControlsOverlay() ||
+                         app_controller->AppUsesBorderlessMode());
+
   if (linux_ui_theme && theme_service_factory->UsingSystemTheme() &&
-      !(app_controller && app_controller->AppUsesWindowControlsOverlay())) {
+      !app_uses_wco_or_borderless) {
     auto nav_button_provider = linux_ui_theme->CreateNavButtonProvider();
     if (nav_button_provider) {
       bool solid_frame = !static_cast<DesktopBrowserFrameAuraLinux*>(
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
index 1ec9b5cb..ab33c5cc 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -41,12 +41,6 @@
 // The content edge images have a shadow built into them.
 const int OpaqueBrowserFrameViewLayout::kContentEdgeShadowThickness = 2;
 
-// The frame border is only visible in restored mode and is hardcoded to 4 px on
-// each side regardless of the system window border size.  This is overridable
-// by subclasses, so RestoredFrameBorderInsets() should be used instead of using
-// this constant directly.
-const int OpaqueBrowserFrameViewLayout::kFrameBorderThickness = 4;
-
 // The frame has a 2 px 3D edge along the top.  This is overridable by
 // subclasses, so RestoredFrameEdgeInsets() should be used instead of using this
 // constant directly.
@@ -171,8 +165,7 @@
 
 gfx::Insets OpaqueBrowserFrameViewLayout::FrameBorderInsets(
     bool restored) const {
-  return (!restored && delegate_->IsFrameCondensed()) ||
-                 delegate_->GetBorderlessModeEnabled()
+  return !restored && delegate_->IsFrameCondensed()
              ? gfx::Insets()
              : RestoredFrameBorderInsets();
 }
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
index 8407590..7ba146d 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
@@ -30,9 +30,14 @@
   // Constants used by OpaqueBrowserFrameView as well.
   static const int kContentEdgeShadowThickness;
 
+  // The frame border is only visible in restored mode and is hardcoded to 4 px
+  // on each side regardless of the system window border size.  This is
+  // overridable by subclasses, so RestoredFrameBorderInsets() should be used
+  // instead of using this constant directly.
+  static constexpr int kFrameBorderThickness = 4;
+
   // Constants public for testing only.
   static constexpr int kNonClientExtraTopThickness = 1;
-  static const int kFrameBorderThickness;
   static const int kTopFrameEdgeThickness;
   static const int kSideFrameEdgeThickness;
   static const int kIconLeftSpacing;
diff --git a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
index 46c51eb..6dac7ad 100644
--- a/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
+++ b/chrome/browser/ui/views/media_router/presentation_receiver_window_view.cc
@@ -168,13 +168,6 @@
   SecurityStateTabHelper::CreateForWebContents(web_contents);
   ChromeTranslateClient::CreateForWebContents(web_contents);
   autofill::ChromeAutofillClient::CreateForWebContents(web_contents);
-  autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      web_contents,
-      autofill::ChromeAutofillClient::FromWebContents(web_contents),
-      base::BindRepeating(
-          &autofill::BrowserDriverInitHook,
-          autofill::ChromeAutofillClient::FromWebContents(web_contents),
-          g_browser_process->GetApplicationLocale()));
   ChromePasswordManagerClient::CreateForWebContentsWithAutofillClient(
       web_contents,
       autofill::ChromeAutofillClient::FromWebContents(web_contents));
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc
new file mode 100644
index 0000000..d171a64
--- /dev/null
+++ b/chrome/browser/ui/views/passwords/manage_passwords_details_view.cc
@@ -0,0 +1,350 @@
+// 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/views/passwords/manage_passwords_details_view.h"
+
+#include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/passwords/password_bubble_view_base.h"
+#include "chrome/browser/ui/views/passwords/views_utils.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/password_manager/core/browser/password_ui_utils.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/clipboard/scoped_clipboard_writer.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/views/bubble/bubble_frame_view.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/button/image_button_factory.h"
+#include "ui/views/controls/highlight_path_generator.h"
+#include "ui/views/controls/textarea/textarea.h"
+#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/layout/flex_layout_view.h"
+#include "ui/views/vector_icons.h"
+
+namespace {
+
+constexpr int kIconSize = 16;
+// TODO(crbug.com/1408790): Row height should be computed from line/icon heights
+// and desired paddings, instead of a fixed value to account for font size
+// changes.
+// The height of the row in the table layout displaying the password details.
+constexpr int kDetailRowHeight = 44;
+constexpr int kMaxLinesVisibleFromPasswordNote = 3;
+
+void WriteToClipboard(const std::u16string& text) {
+  ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste);
+  scw.WriteText(text);
+}
+
+std::unique_ptr<views::View> CreateIconView(
+    const gfx::VectorIcon& vector_icon) {
+  // TODO(crbug.com/1408790): Double check if it should always be not accessible
+  // and that there is always another way to let user know important
+  // information.
+  auto icon = std::make_unique<NonAccessibleImageView>();
+  icon->SetImage(ui::ImageModel::FromVectorIcon(
+      vector_icon, ui::kColorIconSecondary, kIconSize));
+  return icon;
+}
+
+// Creates a view of the same height as the height of the each row in the table,
+// and vertically centers the child view inside it. This is used to wrap icons
+// and image buttons to ensure the icons are vertically aligned with the center
+// of the first row in the text that lives inside labels in the same row even if
+// the text spans multiple lines such as password notes.
+//
+//                <---icon size-->
+//       |        |--------------|
+//       |        |              |
+//       |        |--------------|
+//  line height   |  child view  |
+//       |        |--------------|
+//       |        |              |
+//       |        |--------------|
+//
+std::unique_ptr<views::View> CreateWrappedView(
+    std::unique_ptr<views::View> child_view) {
+  auto wrapper = std::make_unique<views::BoxLayoutView>();
+  wrapper->SetPreferredSize(
+      gfx::Size(/*width=*/kIconSize, /*height=*/kDetailRowHeight));
+  wrapper->SetCrossAxisAlignment(views::BoxLayout::CrossAxisAlignment::kCenter);
+  wrapper->AddChildView(std::move(child_view));
+  return wrapper;
+}
+
+std::unique_ptr<views::View> CreateDetailsRow(
+    const gfx::VectorIcon& row_icon,
+    std::unique_ptr<views::View> detail_view,
+    const gfx::VectorIcon& action_icon,
+    const std::u16string& action_button_tooltip_text,
+    views::Button::PressedCallback action_button_callback) {
+  auto row = std::make_unique<views::FlexLayoutView>();
+  row->SetCollapseMargins(true);
+  row->SetDefault(
+      views::kMarginsKey,
+      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
+                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
+  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
+
+  row->AddChildView(CreateWrappedView(CreateIconView(row_icon)));
+
+  detail_view->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
+                               views::MaximumFlexSizeRule::kUnbounded)
+          .WithWeight(1));
+  row->AddChildView(std::move(detail_view));
+
+  std::unique_ptr<views::ImageButton> action_button =
+      CreateVectorImageButtonWithNativeTheme(std::move(action_button_callback),
+                                             action_icon, kIconSize);
+  action_button->SetTooltipText(action_button_tooltip_text);
+  row->AddChildView(CreateWrappedView(std::move(action_button)));
+  return row;
+}
+
+std::unique_ptr<views::View> CreatePasswordLabelWithEyeIconView(
+    std::unique_ptr<views::Label> password_label) {
+  auto password_label_with_eye_icon_view =
+      std::make_unique<views::BoxLayoutView>();
+  auto* password_label_ptr = password_label_with_eye_icon_view->AddChildView(
+      std::move(password_label));
+  password_label_ptr->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
+                               views::MaximumFlexSizeRule::kScaleToMaximum));
+
+  auto* eye_icon = password_label_with_eye_icon_view->AddChildView(
+      std::make_unique<views::ToggleImageButton>(
+          views::Button::PressedCallback()));
+  eye_icon->SetTooltipText(
+      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_SHOW_PASSWORD));
+  eye_icon->SetToggledTooltipText(
+      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_HIDE_PASSWORD));
+  eye_icon->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
+  views::SetImageFromVectorIconWithColorId(
+      eye_icon, views::kEyeIcon, ui::kColorIcon, ui::kColorIconDisabled);
+  views::SetToggledImageFromVectorIconWithColorId(
+      eye_icon, views::kEyeCrossedIcon, ui::kColorIcon, ui::kColorIconDisabled);
+
+  eye_icon->SetCallback(base::BindRepeating(
+      [](views::ToggleImageButton* toggle_button,
+         views::Label* password_label) {
+        password_label->SetObscured(!password_label->GetObscured());
+        toggle_button->SetToggled(!toggle_button->GetToggled());
+      },
+      eye_icon, password_label_ptr));
+
+  return password_label_with_eye_icon_view;
+}
+
+std::unique_ptr<views::Label> CreateNoteLabel(
+    const password_manager::PasswordForm& form) {
+  // TODO(crbug.com/1382017): use internationalized string.
+  std::u16string note_to_display = u"No note added";
+  absl::optional<std::u16string> note =
+      form.GetNoteWithEmptyUniqueDisplayName();
+  // TODO(crbug.com/1408790): Consider adding another API to the password form
+  // that returns the value directly instead of having to check whether a value
+  // is set or not in all UI surfaces.
+  if (note.has_value() && !note.value().empty()) {
+    note_to_display = note.value();
+  }
+
+  auto note_label = std::make_unique<views::Label>(
+      std::move(note_to_display), views::style::CONTEXT_DIALOG_BODY_TEXT,
+      views::style::STYLE_SECONDARY);
+  note_label->SetMultiLine(true);
+  // TODO(crbug.com/1408790): The label should scroll when contains more lines.
+  note_label->SetMaxLines(kMaxLinesVisibleFromPasswordNote);
+  // TODO(crbug.com/1382017): Review string with UX and use internationalized
+  // string.
+  note_label->SetAccessibleName(u"Password Note");
+  int line_height = views::style::GetLineHeight(note_label->GetTextContext(),
+                                                note_label->GetTextStyle());
+  int vertical_margin = (kDetailRowHeight - line_height) / 2;
+  note_label->SetProperty(views::kMarginsKey,
+                          gfx::Insets::VH(vertical_margin, 0));
+  note_label->SetVerticalAlignment(gfx::VerticalAlignment::ALIGN_TOP);
+  note_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
+  note_label->SetSelectable(true);
+  return note_label;
+}
+
+std::unique_ptr<views::View> CreateEditUsernameRow(
+    const password_manager::PasswordForm& form,
+    raw_ptr<views::Textfield>* textfield) {
+  DCHECK(form.username_value.empty());
+  auto row = std::make_unique<views::FlexLayoutView>();
+  row->SetCollapseMargins(true);
+  row->SetDefault(
+      views::kMarginsKey,
+      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
+                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
+  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
+  row->AddChildView(CreateWrappedView(CreateIconView(kAccountCircleIcon)));
+
+  *textfield = row->AddChildView(std::make_unique<views::Textfield>());
+  // TODO(crbug.com/1382017): use internationalized string.
+  (*textfield)->SetAccessibleName(u"Username");
+  (*textfield)
+      ->SetProperty(
+          views::kFlexBehaviorKey,
+          views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
+                                   views::MaximumFlexSizeRule::kUnbounded));
+  return row;
+}
+
+std::unique_ptr<views::View> CreateEditNoteRow(
+    const password_manager::PasswordForm& form,
+    raw_ptr<views::Textarea>* textarea) {
+  auto row = std::make_unique<views::FlexLayoutView>();
+  row->SetCollapseMargins(true);
+  row->SetDefault(
+      views::kMarginsKey,
+      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
+                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
+  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
+
+  row->AddChildView(CreateWrappedView(CreateIconView(kNotesIcon)));
+
+  *textarea = row->AddChildView(std::make_unique<views::Textarea>());
+  (*textarea)->SetText(
+      form.GetNoteWithEmptyUniqueDisplayName().value_or(std::u16string()));
+  // TODO(crbug.com/1382017): use internationalized string.
+  (*textarea)->SetAccessibleName(u"Password Note");
+  int line_height = views::style::GetLineHeight(views::style::CONTEXT_TEXTFIELD,
+                                                views::style::STYLE_PRIMARY);
+  (*textarea)->SetPreferredSize(
+      gfx::Size(0, kMaxLinesVisibleFromPasswordNote * line_height +
+                       2 * ChromeLayoutProvider::Get()->GetDistanceMetric(
+                               views::DISTANCE_CONTROL_VERTICAL_TEXT_PADDING)));
+  (*textarea)->SetProperty(
+      views::kFlexBehaviorKey,
+      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
+                               views::MaximumFlexSizeRule::kUnbounded));
+  return row;
+}
+
+}  // namespace
+
+// static
+std::unique_ptr<views::View> ManagePasswordsDetailsView::CreateTitleView(
+    const password_manager::PasswordForm& password_form,
+    base::RepeatingClosure on_back_clicked_callback) {
+  ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
+  auto header = std::make_unique<views::BoxLayoutView>();
+  // Set the space between the icons and title similar to the default behavior
+  // in BubbleFrameView::Layout().
+  header->SetBetweenChildSpacing(
+      layout_provider->GetInsetsMetric(views::INSETS_DIALOG_TITLE).left());
+
+  auto back_button = views::CreateVectorImageButtonWithNativeTheme(
+      on_back_clicked_callback, vector_icons::kArrowBackIcon);
+  back_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
+  views::InstallCircleHighlightPathGenerator(back_button.get());
+  header->AddChildView(std::move(back_button));
+
+  std::string shown_origin =
+      password_manager::GetShownOriginAndLinkUrl(password_form).first;
+  header->AddChildView(views::BubbleFrameView::CreateDefaultTitleLabel(
+      base::UTF8ToUTF16(shown_origin)));
+  return header;
+}
+
+ManagePasswordsDetailsView::ManagePasswordsDetailsView(
+    password_manager::PasswordForm password_form,
+    base::RepeatingClosure switched_to_edit_mode_callback)
+    : switched_to_edit_mode_callback_(
+          std::move(switched_to_edit_mode_callback)) {
+  SetOrientation(views::BoxLayout::Orientation::kVertical);
+  if (!password_form.username_value.empty()) {
+    AddChildView(CreateDetailsRow(
+        kAccountCircleIcon, CreateUsernameLabel(password_form),
+        vector_icons::kContentCopyIcon,
+        l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UI_COPY_USERNAME),
+        base::BindRepeating(&WriteToClipboard, password_form.username_value)));
+  } else {
+    // TODO(crbug.com/1408790): use internationalized string for the username
+    // action
+    // button tooltip text.
+    read_username_row_ = AddChildView(CreateDetailsRow(
+        kAccountCircleIcon, CreateUsernameLabel(password_form),
+        vector_icons::kEditIcon, u"Edit Username",
+        base::BindRepeating(
+            &ManagePasswordsDetailsView::SwitchToEditUsernameMode,
+            base::Unretained(this))));
+    edit_username_row_ = AddChildView(
+        CreateEditUsernameRow(password_form, &username_textfield_));
+    edit_username_row_->SetVisible(false);
+  }
+
+  std::unique_ptr<views::Label> password_label =
+      CreatePasswordLabel(password_form);
+  AddChildView(CreateDetailsRow(
+      kKeyIcon,
+      password_form.federation_origin.opaque()
+          ? CreatePasswordLabelWithEyeIconView(std::move(password_label))
+          : std::move(password_label),
+      vector_icons::kContentCopyIcon,
+      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UI_COPY_PASSWORD),
+      base::BindRepeating(&WriteToClipboard, password_form.password_value)));
+
+  // TODO(crbug.com/1408790): use internationalized string for the note action
+  // button tooltip text.
+  // Add two rows: one for reading the note which is visible by default, and
+  // another to edit the note, which is hidden by default. Clicking the Edit
+  // icon next to the note row will hide the read row, and show the edit row.
+  read_note_row_ = AddChildView(CreateDetailsRow(
+      kNotesIcon, CreateNoteLabel(password_form), vector_icons::kEditIcon,
+      u"Edit Note",
+      base::BindRepeating(&ManagePasswordsDetailsView::SwitchToEditNoteMode,
+                          base::Unretained(this))));
+  edit_note_row_ =
+      AddChildView(CreateEditNoteRow(password_form, &note_textarea_));
+  edit_note_row_->SetVisible(false);
+}
+
+ManagePasswordsDetailsView::~ManagePasswordsDetailsView() = default;
+
+void ManagePasswordsDetailsView::SwitchToReadingMode() {
+  read_note_row_->SetVisible(true);
+  edit_note_row_->SetVisible(false);
+}
+
+absl::optional<std::u16string>
+ManagePasswordsDetailsView::GetUserEnteredUsernameValue() const {
+  if (username_textfield_) {
+    return username_textfield_->GetText();
+  }
+  return absl::nullopt;
+}
+
+absl::optional<std::u16string>
+ManagePasswordsDetailsView::GetUserEnteredPasswordNoteValue() const {
+  if (note_textarea_) {
+    return note_textarea_->GetText();
+  }
+  return absl::nullopt;
+}
+
+void ManagePasswordsDetailsView::SwitchToEditUsernameMode() {
+  DCHECK(read_username_row_);
+  DCHECK(edit_username_row_);
+  read_username_row_->SetVisible(false);
+  edit_username_row_->SetVisible(true);
+  switched_to_edit_mode_callback_.Run();
+  DCHECK(username_textfield_);
+  username_textfield_->RequestFocus();
+}
+
+void ManagePasswordsDetailsView::SwitchToEditNoteMode() {
+  read_note_row_->SetVisible(false);
+  edit_note_row_->SetVisible(true);
+  switched_to_edit_mode_callback_.Run();
+  DCHECK(note_textarea_);
+  note_textarea_->RequestFocus();
+}
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_details_view.h b/chrome/browser/ui/views/passwords/manage_passwords_details_view.h
new file mode 100644
index 0000000..fbf549ce
--- /dev/null
+++ b/chrome/browser/ui/views/passwords/manage_passwords_details_view.h
@@ -0,0 +1,69 @@
+// 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_VIEWS_PASSWORDS_MANAGE_PASSWORDS_DETAILS_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_DETAILS_VIEW_H_
+
+#include "base/callback_list.h"
+#include "components/password_manager/core/browser/password_form.h"
+#include "ui/views/layout/box_layout_view.h"
+
+namespace views {
+class Textarea;
+class Textfield;
+class View;
+}  // namespace views
+
+// A view that displays the username, password and a note of password with
+// buttons to copy and edit such information. It has both a reading mode, where
+// data are only copyable, and edit mode where the note or an empty username can
+// be edited. Used in the ManagePasswordsView.
+class ManagePasswordsDetailsView : public views::BoxLayoutView {
+ public:
+  // `password_form` is the password form to be displayed.
+  // `switched_to_edit_mode_callback` is invoked when the user decide to edit
+  // one of the editable field in the UI. This is to inform the embedder to do
+  // the necessary changes (e.g. show update/cancel button).
+  ManagePasswordsDetailsView(
+      password_manager::PasswordForm password_form,
+      base::RepeatingClosure switched_to_edit_mode_callback);
+
+  ManagePasswordsDetailsView(const ManagePasswordsDetailsView&) = delete;
+  ManagePasswordsDetailsView& operator=(const ManagePasswordsDetailsView&) =
+      delete;
+
+  ~ManagePasswordsDetailsView() override;
+
+  // Creates the title for the details view. The title consists of an image
+  // button with a back icon the invokes `on_back_clicked_callback` when
+  // clicked, and in addition, the shown origin for `password_form`.
+  static std::unique_ptr<views::View> CreateTitleView(
+      const password_manager::PasswordForm& password_form,
+      base::RepeatingClosure on_back_clicked_callback);
+
+  // Switches to the reading mode by hiding all the editing UI controls, and
+  // showing the display UI controls instead.
+  void SwitchToReadingMode();
+
+  // In edit mode, those method return the current value entered by the user.
+  // Return nullopt if the correposnding fields are in the reading mode.
+  absl::optional<std::u16string> GetUserEnteredUsernameValue() const;
+  absl::optional<std::u16string> GetUserEnteredPasswordNoteValue() const;
+
+ private:
+  void SwitchToEditUsernameMode();
+  void SwitchToEditNoteMode();
+
+  base::RepeatingClosure switched_to_edit_mode_callback_;
+
+  raw_ptr<views::View> read_username_row_ = nullptr;
+  raw_ptr<views::View> edit_username_row_ = nullptr;
+  raw_ptr<views::Textfield> username_textfield_ = nullptr;
+
+  raw_ptr<views::View> read_note_row_ = nullptr;
+  raw_ptr<views::View> edit_note_row_ = nullptr;
+  raw_ptr<views::Textarea> note_textarea_ = nullptr;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_DETAILS_VIEW_H_
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_list_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_list_view.cc
new file mode 100644
index 0000000..e1eb17f
--- /dev/null
+++ b/chrome/browser/ui/views/passwords/manage_passwords_list_view.cc
@@ -0,0 +1,105 @@
+// 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/views/passwords/manage_passwords_list_view.h"
+
+#include "build/branding_buildflags.h"
+#include "build/build_config.h"
+#include "build/buildflag.h"
+#include "chrome/browser/ui/layout_constants.h"
+#include "chrome/browser/ui/passwords/ui_utils.h"
+#include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/controls/rich_hover_button.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/vector_icons/vector_icons.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/image_model.h"
+#include "ui/gfx/favicon_size.h"
+#include "ui/views/bubble/bubble_frame_view.h"
+#include "ui/views/controls/separator.h"
+
+// static
+std::unique_ptr<views::View> ManagePasswordsListView::CreateTitleView() {
+  const ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
+  auto header = std::make_unique<views::BoxLayoutView>();
+  // Set the space between the icon and title similar to the default behavior in
+  // BubbleFrameView::Layout().
+  header->SetBetweenChildSpacing(
+      layout_provider->GetInsetsMetric(views::INSETS_DIALOG_TITLE).left());
+  header->AddChildView(
+      std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon(
+          GooglePasswordManagerVectorIcon(), ui::kColorIcon,
+          layout_provider->GetDistanceMetric(
+              DISTANCE_BUBBLE_HEADER_VECTOR_ICON_SIZE))));
+  // TODO(crbug.com/1382017): refactor to use the title provided by the
+  // controller instead.
+  header->AddChildView(views::BubbleFrameView::CreateDefaultTitleLabel(
+      u"Saved passwords for this site"));
+  return header;
+}
+
+ManagePasswordsListView::ManagePasswordsListView(
+    const std::vector<std::unique_ptr<password_manager::PasswordForm>>&
+        credentials,
+    ui::ImageModel favicon,
+    base::RepeatingCallback<void(password_manager::PasswordForm)>
+        on_row_clicked_callback,
+    base::RepeatingClosure on_navigate_to_settings_clicked_callback) {
+  SetOrientation(views::BoxLayout::Orientation::kVertical);
+  for (const std::unique_ptr<password_manager::PasswordForm>& password_form :
+       credentials) {
+    absl::optional<ui::ImageModel> store_icon = absl::nullopt;
+    if (password_form->IsUsingAccountStore()) {
+      store_icon = ui::ImageModel::FromVectorIcon(
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+          vector_icons::kGoogleGLogoIcon,
+#else
+          vector_icons::kSyncIcon,
+#endif  // !BUILDFLAG(GOOGLE_CHROME_BRANDING)
+          gfx::kPlaceholderColor, gfx::kFaviconSize);
+    }
+
+    // TODO(crbug.com/1382017): Make sure the alignment works for different use
+    // cases. (e.g. long username, federated credentials)
+    // TODO(crbug.com/1382017): Add a tooltip if needed.
+    AddChildView(std::make_unique<RichHoverButton>(
+        base::BindRepeating(
+            [](base::RepeatingCallback<void(password_manager::PasswordForm)>
+                   on_row_clicked_callback,
+               const password_manager::PasswordForm& password_form) {
+              on_row_clicked_callback.Run(password_form);
+            },
+            on_row_clicked_callback, *password_form),
+        /*main_image_icon=*/favicon,
+        /*title_text=*/GetDisplayUsername(*password_form),
+        /*secondary_text=*/std::u16string(),
+        /*tooltip_text=*/std::u16string(),
+        /*subtitle_text=*/std::u16string(),
+        /*action_image_icon=*/
+        ui::ImageModel::FromVectorIcon(vector_icons::kSubmenuArrowIcon,
+                                       ui::kColorIcon),
+        /*state_icon=*/store_icon));
+  }
+
+  AddChildView(std::make_unique<views::Separator>());
+
+  AddChildView(std::make_unique<RichHoverButton>(
+      std::move(on_navigate_to_settings_clicked_callback),
+      /*main_image_icon=*/
+      ui::ImageModel::FromVectorIcon(vector_icons::kSettingsIcon,
+                                     ui::kColorIcon),
+      /*title_text=*/
+      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_MANAGE_PASSWORDS_BUTTON),
+      /*secondary_text=*/std::u16string(),
+      /*tooltip_text=*/
+      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_MANAGE_PASSWORDS_BUTTON),
+      /*subtitle_text=*/std::u16string(),
+      /*action_image_icon=*/
+      ui::ImageModel::FromVectorIcon(vector_icons::kLaunchIcon,
+                                     ui::kColorIconSecondary,
+                                     GetLayoutConstant(PAGE_INFO_ICON_SIZE)),
+      /*state_icon=*/absl::nullopt));
+}
+
+ManagePasswordsListView::~ManagePasswordsListView() = default;
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_list_view.h b/chrome/browser/ui/views/passwords/manage_passwords_list_view.h
new file mode 100644
index 0000000..eae71df
--- /dev/null
+++ b/chrome/browser/ui/views/passwords/manage_passwords_list_view.h
@@ -0,0 +1,39 @@
+// 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_VIEWS_PASSWORDS_MANAGE_PASSWORDS_LIST_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_LIST_VIEW_H_
+
+#include "base/functional/callback_forward.h"
+#include "components/password_manager/core/browser/password_form.h"
+#include "ui/base/models/image_model.h"
+#include "ui/views/layout/box_layout_view.h"
+
+// A view that displays a list of credentials in a list view, together with an
+// entry to navigate to the password manager. Used in the ManagePasswordsView.
+class ManagePasswordsListView : public views::BoxLayoutView {
+ public:
+  // `credentials` is the list of credentials this view is displaying. `favicon`
+  // is the icon to be displayed next to each row. `on_row_clicked_callback` is
+  // invoked upon clicking a row in the list passing the credential that was
+  // clicked as a param. `on_navigate_to_settings_clicked_callback` is a
+  // callback that informs the embedder that the manage password entry has been
+  // clicked.
+  ManagePasswordsListView(
+      const std::vector<std::unique_ptr<password_manager::PasswordForm>>&
+          credentials,
+      ui::ImageModel favicon,
+      base::RepeatingCallback<void(password_manager::PasswordForm)>
+          on_row_clicked_callback,
+      base::RepeatingClosure on_navigate_to_settings_clicked_callback);
+
+  ManagePasswordsListView(const ManagePasswordsListView&) = delete;
+  ManagePasswordsListView& operator=(const ManagePasswordsListView&) = delete;
+
+  ~ManagePasswordsListView() override;
+
+  static std::unique_ptr<views::View> CreateTitleView();
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_PASSWORDS_MANAGE_PASSWORDS_LIST_VIEW_H_
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_view.cc
index 6661476..ed67b970 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_view.cc
+++ b/chrome/browser/ui/views/passwords/manage_passwords_view.cc
@@ -9,240 +9,22 @@
 #include <utility>
 
 #include "base/functional/bind.h"
-#include "base/strings/utf_string_conversions.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
 #include "chrome/browser/ui/passwords/ui_utils.h"
-#include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/controls/page_switcher_view.h"
-#include "chrome/browser/ui/views/controls/rich_hover_button.h"
+#include "chrome/browser/ui/views/passwords/manage_passwords_details_view.h"
+#include "chrome/browser/ui/views/passwords/manage_passwords_list_view.h"
 #include "chrome/browser/ui/views/passwords/views_utils.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
-#include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
-#include "components/password_manager/core/browser/password_ui_utils.h"
 #include "components/password_manager/core/common/password_manager_features.h"
-#include "components/vector_icons/vector_icons.h"
-#include "ui/base/clipboard/scoped_clipboard_writer.h"
-#include "ui/base/models/image_model.h"
-#include "ui/base/ui_base_types.h"
 #include "ui/gfx/favicon_size.h"
-#include "ui/views/controls/button/button.h"
-#include "ui/views/controls/button/image_button.h"
-#include "ui/views/controls/button/image_button_factory.h"
-#include "ui/views/controls/highlight_path_generator.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/separator.h"
 #include "ui/views/controls/styled_label.h"
-#include "ui/views/controls/textarea/textarea.h"
-#include "ui/views/controls/textfield/textfield.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/box_layout_view.h"
-#include "ui/views/layout/flex_layout_view.h"
-#include "ui/views/layout/layout_provider.h"
-#include "ui/views/layout/layout_types.h"
-#include "ui/views/vector_icons.h"
-#include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
 
-namespace {
-
-constexpr int kIconSize = 16;
-// TODO(crbug.com/1408790): Row height should be computed from line/icon heights
-// and desired paddings, instead of a fixed value to account for font size
-// changes.
-// The height of the row in the table layout displaying the password details.
-constexpr int kDetailRowHeight = 44;
-constexpr int kMaxLinesVisibleFromPasswordNote = 3;
-
-void WriteToClipboard(const std::u16string& text) {
-  ui::ScopedClipboardWriter scw(ui::ClipboardBuffer::kCopyPaste);
-  scw.WriteText(text);
-}
-
-std::unique_ptr<views::View> CreateIconView(
-    const gfx::VectorIcon& vector_icon) {
-  auto icon = std::make_unique<NonAccessibleImageView>();
-  icon->SetImage(ui::ImageModel::FromVectorIcon(
-      vector_icon, ui::kColorIconSecondary, kIconSize));
-  return icon;
-}
-
-// Creates a view of the same height as the height of the each row in the table,
-// and vertically centers the child view inside it. This is used to wrap icons
-// and image buttons to ensure the icons are vertically aligned with the center
-// of the first row in the text that lives inside labels in the same row even if
-// the text spans multiple lines such as password notes.
-std::unique_ptr<views::View> CreateWrappedView(
-    std::unique_ptr<views::View> child_view) {
-  auto wrapper = std::make_unique<views::BoxLayoutView>();
-  wrapper->SetPreferredSize(
-      gfx::Size(/*width=*/kIconSize, /*height=*/kDetailRowHeight));
-  wrapper->SetCrossAxisAlignment(views::BoxLayout::CrossAxisAlignment::kCenter);
-  wrapper->AddChildView(std::move(child_view));
-  return wrapper;
-}
-
-std::unique_ptr<views::View> CreateDetailsRow(
-    const gfx::VectorIcon& row_icon,
-    std::unique_ptr<views::View> detail_view,
-    const gfx::VectorIcon& action_icon,
-    const std::u16string& action_button_tooltip_text,
-    views::Button::PressedCallback action_button_callback) {
-  auto row = std::make_unique<views::FlexLayoutView>();
-  row->SetCollapseMargins(true);
-  row->SetDefault(
-      views::kMarginsKey,
-      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
-                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
-  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
-
-  row->AddChildView(CreateWrappedView(CreateIconView(row_icon)));
-
-  detail_view->SetProperty(
-      views::kFlexBehaviorKey,
-      views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero,
-                               views::MaximumFlexSizeRule::kUnbounded)
-          .WithWeight(1));
-  row->AddChildView(std::move(detail_view));
-
-  std::unique_ptr<views::ImageButton> action_button =
-      CreateVectorImageButtonWithNativeTheme(std::move(action_button_callback),
-                                             action_icon, kIconSize);
-  action_button->SetTooltipText(action_button_tooltip_text);
-  row->AddChildView(CreateWrappedView(std::move(action_button)));
-  return row;
-}
-
-std::unique_ptr<views::View> CreatePasswordLabelWithEyeIconView(
-    std::unique_ptr<views::Label> password_label) {
-  auto password_label_with_eye_icon_view =
-      std::make_unique<views::BoxLayoutView>();
-  auto* password_label_ptr = password_label_with_eye_icon_view->AddChildView(
-      std::move(password_label));
-  password_label_ptr->SetProperty(
-      views::kFlexBehaviorKey,
-      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
-                               views::MaximumFlexSizeRule::kScaleToMaximum));
-
-  auto* eye_icon = password_label_with_eye_icon_view->AddChildView(
-      std::make_unique<views::ToggleImageButton>(
-          views::Button::PressedCallback()));
-  eye_icon->SetTooltipText(
-      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_SHOW_PASSWORD));
-  eye_icon->SetToggledTooltipText(
-      l10n_util::GetStringUTF16(IDS_MANAGE_PASSWORDS_HIDE_PASSWORD));
-  eye_icon->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
-  views::SetImageFromVectorIconWithColorId(
-      eye_icon, views::kEyeIcon, ui::kColorIcon, ui::kColorIconDisabled);
-  views::SetToggledImageFromVectorIconWithColorId(
-      eye_icon, views::kEyeCrossedIcon, ui::kColorIcon, ui::kColorIconDisabled);
-
-  eye_icon->SetCallback(base::BindRepeating(
-      [](views::ToggleImageButton* toggle_button,
-         views::Label* password_label) {
-        password_label->SetObscured(!password_label->GetObscured());
-        toggle_button->SetToggled(!toggle_button->GetToggled());
-      },
-      eye_icon, password_label_ptr));
-
-  return password_label_with_eye_icon_view;
-}
-
-std::unique_ptr<views::Label> CreateNoteLabel(
-    const password_manager::PasswordForm& form) {
-  // TODO(crbug.com/1382017): use internationalized string.
-  std::u16string note_to_display = u"No note added";
-  absl::optional<std::u16string> note =
-      form.GetNoteWithEmptyUniqueDisplayName();
-  // TODO(crbug.com/1408790): Consider adding another API to the password form
-  // that returns the value directly instead of having to check whether a value
-  // is set or not in all UI surfaces.
-  if (note.has_value() && !note.value().empty()) {
-    note_to_display = note.value();
-  }
-
-  auto note_label = std::make_unique<views::Label>(
-      std::move(note_to_display), views::style::CONTEXT_DIALOG_BODY_TEXT,
-      views::style::STYLE_SECONDARY);
-  note_label->SetMultiLine(true);
-  // TODO(crbug.com/1408790): The label should scroll when contains more lines.
-  note_label->SetMaxLines(kMaxLinesVisibleFromPasswordNote);
-  // TODO(crbug.com/1382017): Review string with UX and use internationalized
-  // string.
-  note_label->SetAccessibleName(u"Password Note");
-  int line_height = views::style::GetLineHeight(note_label->GetTextContext(),
-                                                note_label->GetTextStyle());
-  int vertical_margin = (kDetailRowHeight - line_height) / 2;
-  note_label->SetProperty(views::kMarginsKey,
-                          gfx::Insets::VH(vertical_margin, 0));
-  note_label->SetVerticalAlignment(gfx::VerticalAlignment::ALIGN_TOP);
-  note_label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
-  note_label->SetSelectable(true);
-  return note_label;
-}
-
-std::unique_ptr<views::View> CreateEditUsernameRow(
-    const password_manager::PasswordForm& form,
-    views::Textfield** textfield) {
-  DCHECK(form.username_value.empty());
-  auto row = std::make_unique<views::FlexLayoutView>();
-  row->SetCollapseMargins(true);
-  row->SetDefault(
-      views::kMarginsKey,
-      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
-                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
-  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
-  row->AddChildView(CreateWrappedView(CreateIconView(kAccountCircleIcon)));
-
-  *textfield = row->AddChildView(std::make_unique<views::Textfield>());
-  // TODO(crbug.com/1382017): use internationalized string.
-  (*textfield)->SetAccessibleName(u"Username");
-  (*textfield)
-      ->SetProperty(
-          views::kFlexBehaviorKey,
-          views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
-                                   views::MaximumFlexSizeRule::kUnbounded));
-  return row;
-}
-
-std::unique_ptr<views::View> CreateEditNoteRow(
-    const password_manager::PasswordForm& form,
-    views::Textarea** textarea) {
-  auto row = std::make_unique<views::FlexLayoutView>();
-  row->SetCollapseMargins(true);
-  row->SetDefault(
-      views::kMarginsKey,
-      gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric(
-                             views::DISTANCE_RELATED_CONTROL_HORIZONTAL)));
-  row->SetCrossAxisAlignment(views::LayoutAlignment::kStart);
-
-  row->AddChildView(CreateWrappedView(CreateIconView(kNotesIcon)));
-
-  *textarea = row->AddChildView(std::make_unique<views::Textarea>());
-  (*textarea)->SetText(
-      form.GetNoteWithEmptyUniqueDisplayName().value_or(std::u16string()));
-  // TODO(crbug.com/1382017): use internationalized string.
-  (*textarea)->SetAccessibleName(u"Password Note");
-  int line_height = views::style::GetLineHeight(views::style::CONTEXT_TEXTFIELD,
-                                                views::style::STYLE_PRIMARY);
-  (*textarea)->SetPreferredSize(
-      gfx::Size(0, kMaxLinesVisibleFromPasswordNote * line_height +
-                       2 * ChromeLayoutProvider::Get()->GetDistanceMetric(
-                               views::DISTANCE_CONTROL_VERTICAL_TEXT_PADDING)));
-  (*textarea)->SetProperty(
-      views::kFlexBehaviorKey,
-      views::FlexSpecification(views::MinimumFlexSizeRule::kPreferred,
-                               views::MaximumFlexSizeRule::kUnbounded));
-  return row;
-}
-
-}  // namespace
-
 ManagePasswordsView::ManagePasswordsView(content::WebContents* web_contents,
                                          views::View* anchor_view)
     : PasswordBubbleViewBase(web_contents,
@@ -299,26 +81,31 @@
   // Since PasswordBubbleViewBase creates the bubble using
   // BubbleDialogDelegateView::CreateBubble() *after* the construction of the
   // ManagePasswordsView, the title view cannot be set in the constructor.
-  GetBubbleFrameView()->SetTitleView(CreatePasswordListTitleView());
+  GetBubbleFrameView()->SetTitleView(
+      ManagePasswordsListView::CreateTitleView());
 }
 
 bool ManagePasswordsView::Accept() {
   // Accept button is only visible in the details page where a password is
   // selected.
+  DCHECK(password_details_view_);
   DCHECK(currently_selected_password_.has_value());
-  DCHECK(note_textarea_);
   password_manager::PasswordForm updated_form =
       currently_selected_password_.value();
-  // If the username isn't empty, the details view doesn't allow editing the
-  // username, and the user textfield is never created.
-  if (username_textfield_) {
-    updated_form.username_value = username_textfield_->GetText();
+  absl::optional<std::u16string> updated_username =
+      password_details_view_->GetUserEnteredUsernameValue();
+  if (updated_username.has_value()) {
+    updated_form.username_value = updated_username.value();
   }
-  updated_form.SetNoteWithEmptyUniqueDisplayName(note_textarea_->GetText());
+  absl::optional<std::u16string> updated_note =
+      password_details_view_->GetUserEnteredPasswordNoteValue();
+  if (updated_note.has_value()) {
+    updated_form.SetNoteWithEmptyUniqueDisplayName(updated_note.value());
+  }
   controller_.UpdateStoredCredential(currently_selected_password_.value(),
                                      updated_form);
   currently_selected_password_ = std::move(updated_form);
-  SwitchToDisplayMode();
+  SwitchToReadingMode();
   // Return false such that the bubble doesn't get closed upon clicking the
   // button.
   return false;
@@ -328,103 +115,23 @@
   // Cancel button is only visible in the details page where a password is
   // selected.
   DCHECK(currently_selected_password_.has_value());
-  SwitchToDisplayMode();
+  SwitchToReadingMode();
   // Return false such that the bubble doesn't get closed upon clicking the
   // button.
   return false;
 }
 
-std::unique_ptr<views::View> ManagePasswordsView::CreatePasswordListTitleView()
-    const {
-  const ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
-  auto header = std::make_unique<views::BoxLayoutView>();
-  // Set the space between the icon and title similar to the default behavior in
-  // BubbleFrameView::Layout().
-  header->SetBetweenChildSpacing(
-      layout_provider->GetInsetsMetric(views::INSETS_DIALOG_TITLE).left());
-  header->AddChildView(
-      std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon(
-          GooglePasswordManagerVectorIcon(), ui::kColorIcon,
-          layout_provider->GetDistanceMetric(
-              DISTANCE_BUBBLE_HEADER_VECTOR_ICON_SIZE))));
-  // TODO(crbug.com/1382017): refactor to use the title provided by the
-  // controller instead.
-  header->AddChildView(views::BubbleFrameView::CreateDefaultTitleLabel(
-      u"Saved passwords for this site"));
-  return header;
-}
-
-std::unique_ptr<views::View>
-ManagePasswordsView::CreatePasswordDetailsTitleView() {
-  DCHECK(currently_selected_password_.has_value());
-  ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
-  auto header = std::make_unique<views::BoxLayoutView>();
-  // Set the space between the icons and title similar to the default behavior
-  // in BubbleFrameView::Layout().
-  header->SetBetweenChildSpacing(
-      layout_provider->GetInsetsMetric(views::INSETS_DIALOG_TITLE).left());
-
-  auto back_button = views::CreateVectorImageButtonWithNativeTheme(
+std::unique_ptr<ManagePasswordsListView>
+ManagePasswordsView::CreatePasswordListView() {
+  return std::make_unique<ManagePasswordsListView>(
+      controller_.GetCredentials(), GetFaviconImageModel(),
       base::BindRepeating(
-          [](ManagePasswordsView* view) {
-            view->SetButtons(ui::DIALOG_BUTTON_NONE);
-            view->currently_selected_password_ = absl::nullopt;
+          [](ManagePasswordsView* view,
+             password_manager::PasswordForm password_form) {
+            view->currently_selected_password_ = password_form;
             view->RecreateLayout();
           },
           base::Unretained(this)),
-      vector_icons::kArrowBackIcon);
-  back_button->SetTooltipText(l10n_util::GetStringUTF16(IDS_ACCNAME_BACK));
-  views::InstallCircleHighlightPathGenerator(back_button.get());
-  header->AddChildView(std::move(back_button));
-
-  std::string shown_origin = password_manager::GetShownOriginAndLinkUrl(
-                                 currently_selected_password_.value())
-                                 .first;
-  header->AddChildView(views::BubbleFrameView::CreateDefaultTitleLabel(
-      base::UTF8ToUTF16(shown_origin)));
-  return header;
-}
-
-std::unique_ptr<views::View> ManagePasswordsView::CreatePasswordListView() {
-  auto container_view = std::make_unique<views::BoxLayoutView>();
-  container_view->SetOrientation(views::BoxLayout::Orientation::kVertical);
-  for (const std::unique_ptr<password_manager::PasswordForm>& password_form :
-       controller_.GetCredentials()) {
-    absl::optional<ui::ImageModel> store_icon = absl::nullopt;
-    if (password_form->IsUsingAccountStore()) {
-      store_icon = ui::ImageModel::FromVectorIcon(
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-          vector_icons::kGoogleGLogoIcon,
-#else
-          vector_icons::kSyncIcon,
-#endif  // !BUILDFLAG(GOOGLE_CHROME_BRANDING)
-          gfx::kPlaceholderColor, gfx::kFaviconSize);
-    }
-
-    // TODO(crbug.com/1382017): Make sure the alignment works for different use
-    // cases. (e.g. long username, federated credentials)
-    container_view->AddChildView(std::make_unique<RichHoverButton>(
-        base::BindRepeating(
-            [](ManagePasswordsView* view,
-               const password_manager::PasswordForm& password_form) {
-              view->currently_selected_password_ = password_form;
-              view->RecreateLayout();
-            },
-            base::Unretained(this), *password_form),
-        /*main_image_icon=*/GetFaviconImageModel(),
-        /*title_text=*/GetDisplayUsername(*password_form),
-        /*secondary_text=*/std::u16string(),
-        /*tooltip_text=*/std::u16string(),
-        /*subtitle_text=*/std::u16string(),
-        /*action_image_icon=*/
-        ui::ImageModel::FromVectorIcon(vector_icons::kSubmenuArrowIcon,
-                                       ui::kColorIcon),
-        /*state_icon=*/store_icon));
-  }
-
-  container_view->AddChildView(std::make_unique<views::Separator>());
-
-  container_view->AddChildView(std::make_unique<RichHoverButton>(
       base::BindRepeating(
           [](ManagePasswordsView* view) {
             view->controller_.OnManageClicked(
@@ -432,81 +139,23 @@
                     kManagePasswordsBubble);
             view->CloseBubble();
           },
-          base::Unretained(this)),
-      /*main_image_icon=*/
-      ui::ImageModel::FromVectorIcon(vector_icons::kSettingsIcon,
-                                     ui::kColorIcon),
-      /*title_text=*/
-      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_MANAGE_PASSWORDS_BUTTON),
-      /*secondary_text=*/std::u16string(),
-      /*tooltip_text=*/
-      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_MANAGE_PASSWORDS_BUTTON),
-      /*subtitle_text=*/std::u16string(),
-      /*action_image_icon=*/
-      ui::ImageModel::FromVectorIcon(vector_icons::kLaunchIcon,
-                                     ui::kColorIconSecondary,
-                                     GetLayoutConstant(PAGE_INFO_ICON_SIZE)),
-      /*state_icon=*/absl::nullopt));
-  return container_view;
+          base::Unretained(this)));
 }
 
-std::unique_ptr<views::View> ManagePasswordsView::CreatePasswordDetailsView() {
+std::unique_ptr<ManagePasswordsDetailsView>
+ManagePasswordsView::CreatePasswordDetailsView() {
   DCHECK(currently_selected_password_.has_value());
-  auto container_view = std::make_unique<views::BoxLayoutView>();
-  container_view->SetOrientation(views::BoxLayout::Orientation::kVertical);
-
-  if (!currently_selected_password_->username_value.empty()) {
-    // Set the edit username field to nullptr in case the username has been just
-    // added in the Edit username mode, and the layout is being recreated.
-    display_username_row_ = nullptr;
-    edit_username_row_ = nullptr;
-    username_textfield_ = nullptr;
-    container_view->AddChildView(CreateDetailsRow(
-        kAccountCircleIcon, CreateUsernameLabel(*currently_selected_password_),
-        vector_icons::kContentCopyIcon,
-        l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UI_COPY_USERNAME),
-        base::BindRepeating(&WriteToClipboard,
-                            currently_selected_password_->username_value)));
-  } else {
-    // TODO(crbug.com/1408790): use internationalized string for the username
-    // action
-    // button tooltip text.
-    display_username_row_ = container_view->AddChildView(CreateDetailsRow(
-        kAccountCircleIcon, CreateUsernameLabel(*currently_selected_password_),
-        vector_icons::kEditIcon, u"Edit Username",
-        base::BindRepeating(&ManagePasswordsView::SwitchToEditUsernameMode,
-                            base::Unretained(this))));
-    edit_username_row_ = container_view->AddChildView(CreateEditUsernameRow(
-        *currently_selected_password_, &username_textfield_));
-    edit_username_row_->SetVisible(false);
-  }
-
-  std::unique_ptr<views::Label> password_label =
-      CreatePasswordLabel(*currently_selected_password_);
-  container_view->AddChildView(CreateDetailsRow(
-      kKeyIcon,
-      currently_selected_password_->federation_origin.opaque()
-          ? CreatePasswordLabelWithEyeIconView(std::move(password_label))
-          : std::move(password_label),
-      vector_icons::kContentCopyIcon,
-      l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_UI_COPY_PASSWORD),
-      base::BindRepeating(&WriteToClipboard,
-                          currently_selected_password_->password_value)));
-
-  // TODO(crbug.com/1408790): use internationalized string for the note action
-  // button tooltip text.
-  // Add two rows: one for displaying the note which is visible by default, and
-  // another to edit the note, which is hidden by default. Clicking the Edit
-  // icon next to the note row will hide the display row, and show the edit row.
-  display_note_row_ = container_view->AddChildView(CreateDetailsRow(
-      kNotesIcon, CreateNoteLabel(*currently_selected_password_),
-      vector_icons::kEditIcon, u"Edit Note",
-      base::BindRepeating(&ManagePasswordsView::SwitchToEditNoteMode,
-                          base::Unretained(this))));
-  edit_note_row_ = container_view->AddChildView(
-      CreateEditNoteRow(*currently_selected_password_, &note_textarea_));
-  edit_note_row_->SetVisible(false);
-  return container_view;
+  return std::make_unique<ManagePasswordsDetailsView>(
+      currently_selected_password_.value(),
+      base::BindRepeating(
+          [](ManagePasswordsView* view) {
+            view->SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
+            // TODO(crbug.com/1408790): use internationalized string.
+            view->SetButtonLabel(ui::DIALOG_BUTTON_OK, u"Update");
+            view->PreferredSizeChanged();
+            view->SizeToContents();
+          },
+          base::Unretained(this)));
 }
 
 std::unique_ptr<views::View> ManagePasswordsView::CreateFooterView() {
@@ -551,53 +200,38 @@
   if (currently_selected_password_.has_value()) {
     // TODO(crbug.com/1382017): implement authentication before navigating to
     // the details page.
-    frame_view->SetTitleView(CreatePasswordDetailsTitleView());
+    frame_view->SetTitleView(ManagePasswordsDetailsView::CreateTitleView(
+        currently_selected_password_.value(),
+        base::BindRepeating(
+            [](ManagePasswordsView* view) {
+              view->SetButtons(ui::DIALOG_BUTTON_NONE);
+              view->currently_selected_password_ = absl::nullopt;
+              view->RecreateLayout();
+            },
+            base::Unretained(this))));
     frame_view->SetFootnoteView(nullptr);
-    page_container_->SwitchToPage(CreatePasswordDetailsView());
+    std::unique_ptr<ManagePasswordsDetailsView> details_view =
+        CreatePasswordDetailsView();
+    password_details_view_ = details_view.get();
+    page_container_->SwitchToPage(std::move(details_view));
     page_container_->SetProperty(
         views::kMarginsKey,
         gfx::Insets().set_bottom(ChromeLayoutProvider::Get()
                                      ->GetInsetsMetric(views::INSETS_DIALOG)
                                      .bottom()));
   } else {
-    frame_view->SetTitleView(CreatePasswordListTitleView());
+    frame_view->SetTitleView(ManagePasswordsListView::CreateTitleView());
     frame_view->SetFootnoteView(CreateFooterView());
     page_container_->SwitchToPage(CreatePasswordListView());
     page_container_->SetProperty(views::kMarginsKey, gfx::Insets());
+    password_details_view_ = nullptr;
   }
   PreferredSizeChanged();
   SizeToContents();
 }
 
-void ManagePasswordsView::SwitchToEditUsernameMode() {
-  DCHECK(display_username_row_);
-  DCHECK(edit_username_row_);
-  display_username_row_->SetVisible(false);
-  edit_username_row_->SetVisible(true);
-  SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
-  // TODO(crbug.com/1408790): use internationalized string.
-  SetButtonLabel(ui::DIALOG_BUTTON_OK, u"Update");
-  PreferredSizeChanged();
-  SizeToContents();
-  DCHECK(username_textfield_);
-  username_textfield_->RequestFocus();
-}
-
-void ManagePasswordsView::SwitchToEditNoteMode() {
-  display_note_row_->SetVisible(false);
-  edit_note_row_->SetVisible(true);
-  SetButtons(ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL);
-  // TODO(crbug.com/1408790): use internationalized string.
-  SetButtonLabel(ui::DIALOG_BUTTON_OK, u"Update");
-  PreferredSizeChanged();
-  SizeToContents();
-  DCHECK(note_textarea_);
-  note_textarea_->RequestFocus();
-}
-
-void ManagePasswordsView::SwitchToDisplayMode() {
-  display_note_row_->SetVisible(true);
-  edit_note_row_->SetVisible(false);
+void ManagePasswordsView::SwitchToReadingMode() {
+  password_details_view_->SwitchToReadingMode();
   SetButtons(ui::DIALOG_BUTTON_NONE);
   RecreateLayout();
 }
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_view.h b/chrome/browser/ui/views/passwords/manage_passwords_view.h
index fd59a6c..f1860c5 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_view.h
+++ b/chrome/browser/ui/views/passwords/manage_passwords_view.h
@@ -11,10 +11,8 @@
 #include "components/password_manager/core/browser/password_form.h"
 
 class PageSwitcherView;
-namespace views {
-class Textarea;
-class Textfield;
-}
+class ManagePasswordsListView;
+class ManagePasswordsDetailsView;
 
 // A dialog for managing stored password and federated login information for a
 // specific site. A user can see the details of the passwords, and edit the
@@ -38,10 +36,8 @@
   bool Cancel() override;
   bool Accept() override;
 
-  std::unique_ptr<views::View> CreatePasswordListTitleView() const;
-  std::unique_ptr<views::View> CreatePasswordListView();
-  std::unique_ptr<views::View> CreatePasswordDetailsView();
-  std::unique_ptr<views::View> CreatePasswordDetailsTitleView();
+  std::unique_ptr<ManagePasswordsListView> CreatePasswordListView();
+  std::unique_ptr<ManagePasswordsDetailsView> CreatePasswordDetailsView();
   std::unique_ptr<views::View> CreateFooterView();
 
   // Changes the contents of the page to either display the details of
@@ -49,10 +45,7 @@
   // `currently_selected_password_` isn't set.
   void RecreateLayout();
 
-  void SwitchToEditUsernameMode();
-  void SwitchToEditNoteMode();
-
-  void SwitchToDisplayMode();
+  void SwitchToReadingMode();
 
   // Called when the favicon is loaded. If |favicon| isn't empty, it sets
   // |favicon_| and invokes RecreateLayout().
@@ -70,13 +63,7 @@
   // currently selected password.
   absl::optional<password_manager::PasswordForm> currently_selected_password_;
 
-  raw_ptr<views::View> display_username_row_ = nullptr;
-  raw_ptr<views::View> edit_username_row_ = nullptr;
-  views::Textfield* username_textfield_ = nullptr;
-
-  raw_ptr<views::View> display_note_row_ = nullptr;
-  raw_ptr<views::View> edit_note_row_ = nullptr;
-  views::Textarea* note_textarea_ = nullptr;
+  ManagePasswordsDetailsView* password_details_view_ = nullptr;
 
   ItemsBubbleController controller_;
   raw_ptr<PageSwitcherView> page_container_ = nullptr;
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
index 0cbbd42d..6b568163 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
+++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
-#include "chrome/browser/ui/passwords/ui_utils.h"
 #include "chrome/browser/ui/views/accessibility/theme_tracking_non_accessible_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
@@ -177,33 +176,6 @@
     g_manage_passwords_bubble_ = nullptr;
 }
 
-// static
-std::unique_ptr<views::Label> PasswordBubbleViewBase::CreateUsernameLabel(
-    const password_manager::PasswordForm& form) {
-  auto label = std::make_unique<views::Label>(
-      GetDisplayUsername(form), views::style::CONTEXT_DIALOG_BODY_TEXT,
-      views::style::STYLE_SECONDARY);
-  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  return label;
-}
-
-// static
-std::unique_ptr<views::Label> PasswordBubbleViewBase::CreatePasswordLabel(
-    const password_manager::PasswordForm& form) {
-  std::unique_ptr<views::Label> label = std::make_unique<views::Label>(
-      GetDisplayPassword(form), views::style::CONTEXT_DIALOG_BODY_TEXT);
-  if (form.federation_origin.opaque()) {
-    label->SetTextStyle(STYLE_SECONDARY_MONOSPACED);
-    label->SetObscured(true);
-    label->SetElideBehavior(gfx::TRUNCATE);
-  } else {
-    label->SetTextStyle(views::style::STYLE_SECONDARY);
-    label->SetElideBehavior(gfx::ELIDE_HEAD);
-  }
-  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  return label;
-}
-
 void PasswordBubbleViewBase::SetBubbleHeader(int light_image_id,
                                              int dark_image_id) {
   ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.h b/chrome/browser/ui/views/passwords/password_bubble_view_base.h
index ba2b7e20..d28f472 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_view_base.h
+++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.h
@@ -5,8 +5,6 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_BUBBLE_VIEW_BASE_H_
 #define CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_BUBBLE_VIEW_BASE_H_
 
-#include <memory>
-
 #include "build/build_config.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
 
@@ -14,14 +12,6 @@
 class WebContents;
 }
 
-namespace password_manager {
-struct PasswordForm;
-}  // namespace password_manager
-
-namespace views {
-class Label;
-}
-
 class PasswordBubbleControllerBase;
 
 // Base class for all manage-passwords bubbles. Provides static methods for
@@ -77,11 +67,6 @@
 
   ~PasswordBubbleViewBase() override;
 
-  static std::unique_ptr<views::Label> CreateUsernameLabel(
-      const password_manager::PasswordForm& form);
-  static std::unique_ptr<views::Label> CreatePasswordLabel(
-      const password_manager::PasswordForm& form);
-
   // Sets the resource ids of the images used in the header in light and dark
   // mode.
   void SetBubbleHeader(int light_image_id, int dark_image_id);
diff --git a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
index c5b92d5..9e0b67d5b 100644
--- a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
+++ b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
@@ -75,9 +75,9 @@
 
   auto warning_icon = std::make_unique<views::ImageView>();
   warning_icon->SetCanProcessEventsWithinSubtree(false);
-  warning_icon->SetImage(
-      ui::ImageModel::FromVectorIcon(vector_icons::kNotificationWarningIcon,
-                                     ui::kColorAlertMediumSeverity, kIconSize));
+  warning_icon->SetImage(ui::ImageModel::FromVectorIcon(
+      vector_icons::kNotificationWarningIcon, ui::kColorAlertMediumSeverityIcon,
+      kIconSize));
   password_strength_view->AddChildView(std::move(warning_icon));
 
   auto* layout = password_strength_view->SetLayoutManager(
@@ -310,8 +310,8 @@
     SetLayoutManager(std::make_unique<views::FillLayout>());
     auto warning_icon = std::make_unique<views::ImageView>();
     warning_icon->SetImage(ui::ImageModel::FromVectorIcon(
-        vector_icons::kNotificationWarningIcon, ui::kColorAlertMediumSeverity,
-        kIconSize));
+        vector_icons::kNotificationWarningIcon,
+        ui::kColorAlertMediumSeverityIcon, kIconSize));
     AddChildView(std::move(warning_icon));
     return;
   }
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
index d124ffe..54a96b2a 100644
--- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
+++ b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
 #include "chrome/browser/ui/views/passwords/password_items_view.h"
+#include "chrome/browser/ui/views/passwords/views_utils.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_types.h"
diff --git a/chrome/browser/ui/views/passwords/views_utils.cc b/chrome/browser/ui/views/passwords/views_utils.cc
index fdb07ba..64b26e7a 100644
--- a/chrome/browser/ui/views/passwords/views_utils.cc
+++ b/chrome/browser/ui/views/passwords/views_utils.cc
@@ -4,7 +4,9 @@
 
 #include "chrome/browser/ui/views/passwords/views_utils.h"
 
+#include "chrome/browser/ui/passwords/ui_utils.h"
 #include "chrome/browser/ui/views/chrome_typography.h"
+#include "components/password_manager/core/browser/password_form.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/styled_label.h"
 
@@ -54,3 +56,28 @@
 
   return label;
 }
+
+std::unique_ptr<views::Label> CreateUsernameLabel(
+    const password_manager::PasswordForm& form) {
+  auto label = std::make_unique<views::Label>(
+      GetDisplayUsername(form), views::style::CONTEXT_DIALOG_BODY_TEXT,
+      views::style::STYLE_SECONDARY);
+  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  return label;
+}
+
+std::unique_ptr<views::Label> CreatePasswordLabel(
+    const password_manager::PasswordForm& form) {
+  std::unique_ptr<views::Label> label = std::make_unique<views::Label>(
+      GetDisplayPassword(form), views::style::CONTEXT_DIALOG_BODY_TEXT);
+  if (form.federation_origin.opaque()) {
+    label->SetTextStyle(STYLE_SECONDARY_MONOSPACED);
+    label->SetObscured(true);
+    label->SetElideBehavior(gfx::TRUNCATE);
+  } else {
+    label->SetTextStyle(views::style::STYLE_SECONDARY);
+    label->SetElideBehavior(gfx::ELIDE_HEAD);
+  }
+  label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  return label;
+}
diff --git a/chrome/browser/ui/views/passwords/views_utils.h b/chrome/browser/ui/views/passwords/views_utils.h
index f97ea70..a3e6eae 100644
--- a/chrome/browser/ui/views/passwords/views_utils.h
+++ b/chrome/browser/ui/views/passwords/views_utils.h
@@ -11,9 +11,14 @@
 #include "base/functional/callback_forward.h"
 
 namespace views {
+class Label;
 class StyledLabel;
 }
 
+namespace password_manager {
+struct PasswordForm;
+}
+
 // Returns a label that can be displayed as a footer for Password Manager
 // bubbles on Desktop or in other UI surfaces. `text_message_id` is the message
 // id of the whole text displayed in the footer which should have two place
@@ -35,4 +40,11 @@
     int link_message_id,
     base::RepeatingClosure open_link_closure);
 
+// Returns label diaplying the username and password. It handles edge cases like
+// empty username and federated credentials.
+std::unique_ptr<views::Label> CreateUsernameLabel(
+    const password_manager::PasswordForm& form);
+std::unique_ptr<views::Label> CreatePasswordLabel(
+    const password_manager::PasswordForm& form);
+
 #endif  // CHROME_BROWSER_UI_VIEWS_PASSWORDS_VIEWS_UTILS_H_
diff --git a/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.cc b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.cc
new file mode 100644
index 0000000..ac285e5
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.cc
@@ -0,0 +1,24 @@
+// 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/views/side_panel/history_clusters/history_clusters_side_panel_controller.h"
+
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_coordinator.h"
+
+HistoryClustersSidePanelController::HistoryClustersSidePanelController(
+    content::WebContents* web_contents)
+    : web_contents_(web_contents) {}
+
+HistoryClustersSidePanelController::~HistoryClustersSidePanelController() =
+    default;
+
+void HistoryClustersSidePanelController::ShowJourneysSidePanel(
+    const std::string& query) {
+  if (Browser* browser = chrome::FindBrowserWithWebContents(web_contents_)) {
+    auto* coordinator =
+        HistoryClustersSidePanelCoordinator::GetOrCreateForBrowser(browser);
+    coordinator->Show(query);
+  }
+}
diff --git a/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.h b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.h
new file mode 100644
index 0000000..4ce055a
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.h
@@ -0,0 +1,35 @@
+// 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_VIEWS_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_H_
+#define CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_H_
+
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_tab_helper.h"
+
+namespace content {
+class WebContents;
+}  // namespace content
+
+class HistoryClustersSidePanelController
+    : public side_panel::HistoryClustersTabHelper::Delegate {
+ public:
+  explicit HistoryClustersSidePanelController(
+      content::WebContents* web_contents);
+  HistoryClustersSidePanelController(
+      const HistoryClustersSidePanelController&) = delete;
+  HistoryClustersSidePanelController& operator=(
+      const HistoryClustersSidePanelController&) = delete;
+  ~HistoryClustersSidePanelController() override;
+
+  // HistoryClustersTabHelper::Delegate:
+  void ShowJourneysSidePanel(const std::string& query) override;
+
+ private:
+  const raw_ptr<content::WebContents> web_contents_;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_HISTORY_CLUSTERS_HISTORY_CLUSTERS_SIDE_PANEL_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller_utils.cc b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller_utils.cc
new file mode 100644
index 0000000..45859af6
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller_utils.cc
@@ -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.
+
+#include "chrome/browser/ui/side_panel/history_clusters/history_clusters_side_panel_controller_utils.h"
+
+#include <memory>
+
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/views/side_panel/history_clusters/history_clusters_side_panel_controller.h"
+
+namespace side_panel::history_clusters {
+
+std::unique_ptr<HistoryClustersTabHelper::Delegate> CreateDelegate(
+    content::WebContents* web_contents) {
+  return std::make_unique<HistoryClustersSidePanelController>(web_contents);
+}
+
+}  // namespace side_panel::history_clusters
diff --git a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc
index 3a8b47f..05759d8a 100644
--- a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc
+++ b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc
@@ -29,6 +29,7 @@
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/browser/image_loader.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
diff --git a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view_browsertest.cc b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view_browsertest.cc
index 7bd7ed3fb..62e67037 100644
--- a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view_browsertest.cc
@@ -42,6 +42,7 @@
 #include "extensions/browser/extension_dialog_auto_confirm.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/extension_util.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/test/result_catcher.h"
 #include "google_apis/gaia/fake_gaia.h"
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
index 8f8d78c..c44a69c 100644
--- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -78,6 +78,10 @@
 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.h"
 #endif
 
+#if BUILDFLAG(IS_LINUX)
+#include "chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h"
+#endif
+
 namespace {
 
 #if BUILDFLAG(IS_MAC)
@@ -669,12 +673,24 @@
   EXPECT_EQ(client_view_size.width(), kExpectedWidth);
   EXPECT_EQ(EvalJs(popup_web_contents, "window.innerHeight").ExtractInt(),
             kExpectedHeight);
-  EXPECT_EQ(EvalJs(popup_web_contents, "window.outerHeight").ExtractInt(),
-            kExpectedHeight);
   EXPECT_EQ(EvalJs(popup_web_contents, "window.innerWidth").ExtractInt(),
             kExpectedWidth);
+
+// For ChromeOS the resizable borders are "outside of the window" where as for
+// Linux they are "inside of the window".
+#if BUILDFLAG(IS_CHROMEOS)
+  EXPECT_EQ(EvalJs(popup_web_contents, "window.outerHeight").ExtractInt(),
+            kExpectedHeight);
   EXPECT_EQ(EvalJs(popup_web_contents, "window.outerWidth").ExtractInt(),
             kExpectedWidth);
+#elif BUILDFLAG(IS_LINUX)
+  constexpr int kFrameInsets =
+      2 * OpaqueBrowserFrameViewLayout::kFrameBorderThickness;
+  EXPECT_EQ(EvalJs(popup_web_contents, "window.outerHeight").ExtractInt(),
+            kExpectedHeight + kFrameInsets);
+  EXPECT_EQ(EvalJs(popup_web_contents, "window.outerWidth").ExtractInt(),
+            kExpectedWidth + kFrameInsets);
+#endif
 }
 
 IN_PROC_BROWSER_TEST_F(WebAppFrameToolbarBrowserTest_Borderless, PopupResize) {
@@ -713,8 +729,16 @@
   constexpr int kExpectedWidth = 600, kExpectedHeight = 500;
   const auto& client_view_size =
       popup_browser_view->frame()->client_view()->size();
+
+#if BUILDFLAG(IS_CHROMEOS)
   EXPECT_EQ(client_view_size.height(), kExpectedHeight);
   EXPECT_EQ(client_view_size.width(), kExpectedWidth);
+#elif BUILDFLAG(IS_LINUX)
+  constexpr int kFrameInsets =
+      2 * OpaqueBrowserFrameViewLayout::kFrameBorderThickness;
+  EXPECT_EQ(client_view_size.height(), kExpectedHeight - kFrameInsets);
+  EXPECT_EQ(client_view_size.width(), kExpectedWidth - kFrameInsets);
+#endif
 
 #if !BUILDFLAG(IS_LINUX)  // TODO(crbug.com/1412331): Flaky on Linux.
   EXPECT_EQ(EvalJs(popup_web_contents, "window.innerHeight").ExtractInt(),
diff --git a/chrome/browser/ui/webui/ash/login/network_state_informer.cc b/chrome/browser/ui/webui/ash/login/network_state_informer.cc
index ada62b3..713df41 100644
--- a/chrome/browser/ui/webui/ash/login/network_state_informer.cc
+++ b/chrome/browser/ui/webui/ash/login/network_state_informer.cc
@@ -178,7 +178,7 @@
 
   state_ = new_state;
   network_path_ = new_network_path;
-  proxy_config_ = base::Value();
+  proxy_config_.reset();
 
   if (state_ == ONLINE) {
     for (NetworkStateInformerObserver& observer : observers_)
@@ -189,13 +189,19 @@
 }
 
 bool NetworkStateInformer::UpdateProxyConfig(const NetworkState* network) {
-  if (!network)
+  if (!network) {
     return false;
+  }
 
-  if (proxy_config_ == network->proxy_config())
+  if (proxy_config_ == network->proxy_config()) {
     return false;
+  }
 
-  proxy_config_ = network->proxy_config().Clone();
+  if (network->proxy_config()) {
+    proxy_config_ = network->proxy_config()->Clone();
+  } else {
+    proxy_config_.reset();
+  }
   return true;
 }
 
diff --git a/chrome/browser/ui/webui/ash/login/network_state_informer.h b/chrome/browser/ui/webui/ash/login/network_state_informer.h
index 23852652..20235e8d 100644
--- a/chrome/browser/ui/webui/ash/login/network_state_informer.h
+++ b/chrome/browser/ui/webui/ash/login/network_state_informer.h
@@ -14,15 +14,13 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/scoped_observation.h"
+#include "base/values.h"
 #include "chrome/browser/ash/login/screens/network_error.h"
 #include "chrome/browser/ash/login/ui/captive_portal_window_proxy.h"
 #include "chromeos/ash/components/network/network_state.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/ash/components/network/network_state_handler_observer.h"
-
-namespace base {
-class Value;
-}
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace ash {
 
@@ -44,8 +42,8 @@
 
   class NetworkStateInformerObserver {
    public:
-    NetworkStateInformerObserver() {}
-    virtual ~NetworkStateInformerObserver() {}
+    NetworkStateInformerObserver() = default;
+    virtual ~NetworkStateInformerObserver() = default;
 
     virtual void UpdateState(NetworkError::ErrorReason reason) = 0;
     virtual void OnNetworkReady() {}
@@ -87,7 +85,7 @@
 
   State state_;
   std::string network_path_;
-  base::Value proxy_config_;
+  absl::optional<base::Value::Dict> proxy_config_;
 
   base::ObserverList<NetworkStateInformerObserver>::Unchecked observers_;
 
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index d7e9627..b608742 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -908,8 +908,10 @@
     if (url.host_piece() == chrome::kChromeUINewTabPageThirdPartyHost)
       return &NewWebUI<NewTabPageThirdPartyUI>;
   }
-  if (url.host_piece() == chrome::kChromeUIFeedbackHost)
+  if (url.host_piece() == chrome::kChromeUIFeedbackHost &&
+      FeedbackUI::IsFeedbackEnabled(profile)) {
     return &NewWebUI<FeedbackUI>;
+  }
   if (url.host_piece() == chrome::kChromeUIReadLaterHost)
     return &NewWebUI<ReadingListUI>;
   if (url.host_piece() == chrome::kChromeUIBookmarksSidePanelHost)
@@ -1135,7 +1137,8 @@
 #if !BUILDFLAG(IS_ANDROID)
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   if (url.host_piece() == chrome::kChromeUICastFeedbackHost &&
-      media_router::MediaRouterEnabled(profile)) {
+      media_router::MediaRouterEnabled(profile) &&
+      FeedbackUI::IsFeedbackEnabled(profile)) {
     return &NewWebUI<media_router::CastFeedbackUI>;
   }
 #endif
diff --git a/chrome/browser/ui/webui/feedback/feedback_ui.cc b/chrome/browser/ui/webui/feedback/feedback_ui.cc
index 6f89b18..8bac26c 100644
--- a/chrome/browser/ui/webui/feedback/feedback_ui.cc
+++ b/chrome/browser/ui/webui/feedback/feedback_ui.cc
@@ -6,11 +6,13 @@
 
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/browser_resources.h"
 #include "chrome/grit/feedback_resources.h"
 #include "chrome/grit/feedback_resources_map.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/prefs/pref_service.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
@@ -91,3 +93,7 @@
 }
 
 FeedbackUI::~FeedbackUI() = default;
+
+bool FeedbackUI::IsFeedbackEnabled(Profile* profile) {
+  return profile->GetPrefs()->GetBoolean(prefs::kUserFeedbackAllowed);
+}
diff --git a/chrome/browser/ui/webui/feedback/feedback_ui.h b/chrome/browser/ui/webui/feedback/feedback_ui.h
index f3a4f52e..2fe29f1 100644
--- a/chrome/browser/ui/webui/feedback/feedback_ui.h
+++ b/chrome/browser/ui/webui/feedback/feedback_ui.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
 #define CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
 
+#include "chrome/browser/profiles/profile.h"
 #include "ui/web_dialogs/web_dialog_ui.h"
 
 // The implementation for the chrome://feedback page.
@@ -14,6 +15,8 @@
   FeedbackUI(const FeedbackUI&) = delete;
   FeedbackUI& operator=(const FeedbackUI&) = delete;
   ~FeedbackUI() override;
+
+  static bool IsFeedbackEnabled(Profile* profile);
 };
 
 #endif  // CHROME_BROWSER_UI_WEBUI_FEEDBACK_FEEDBACK_UI_H_
diff --git a/chrome/browser/ui/webui/feedback/feedback_ui_unittest.cc b/chrome/browser/ui/webui/feedback/feedback_ui_unittest.cc
new file mode 100644
index 0000000..4453fe7
--- /dev/null
+++ b/chrome/browser/ui/webui/feedback/feedback_ui_unittest.cc
@@ -0,0 +1,29 @@
+// 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/feedback/feedback_ui.h"
+
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class FeedbackUITest : public testing::Test {
+ protected:
+  FeedbackUITest() { profile_ = std::make_unique<TestingProfile>(); }
+
+  content::BrowserTaskEnvironment task_environment_;
+  std::unique_ptr<TestingProfile> profile_;
+};
+
+TEST_F(FeedbackUITest, IsFeedbackEnabledTrue) {
+  profile_->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed, true);
+  EXPECT_TRUE(FeedbackUI::IsFeedbackEnabled(profile_.get()));
+}
+
+TEST_F(FeedbackUITest, IsFeedbackEnabledFalse) {
+  profile_->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed, false);
+  EXPECT_FALSE(FeedbackUI::IsFeedbackEnabled(profile_.get()));
+}
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 3384a2c..264f4bd 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -764,7 +764,7 @@
     mojo::PendingReceiver<ntp::history_clusters::mojom::PageHandler>
         pending_page_handler) {
   history_clusters_handler_ = std::make_unique<HistoryClustersPageHandler>(
-      std::move(pending_page_handler), profile_);
+      std::move(pending_page_handler), web_contents());
 }
 
 void NewTabPageUI::BindInterface(
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
index a0622d22..c0a8c87 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -366,7 +366,7 @@
       {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
        base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
       base::BindOnce(
-          [](base::FilePath path, base::StringPiece content) {
+          [](const base::FilePath& path, base::StringPiece content) {
             base::WriteFile(path, content);
           },
           path, json_policies));
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
index b981afa..dc170b2 100644
--- a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
+++ b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -87,6 +87,8 @@
       FeatureToValue(sandbox::policy::features::kRendererAppContainer));
   features.Append(
       FeatureToValue(sandbox::policy::features::kSharedSandboxPolicies));
+  features.Append(
+      FeatureToValue(sandbox::policy::features::kWinSboxAllowSystemFonts));
   features.Append(FeatureToValue(
       sandbox::policy::features::kWinSboxDisableExtensionPoints));
   return features;
diff --git a/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom b/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
index 0dc0c127..85c31b3 100644
--- a/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
+++ b/chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom
@@ -196,7 +196,6 @@
 // MultiDevice section.
 const string kMultiDeviceSectionPath = "multidevice";
 const string kMultiDeviceFeaturesSubpagePath = "multidevice/features";
-const string kSmartLockSubpagePath = "multidevice/features/smartLock";
 const string kNearbyShareSubpagePath = "multidevice/nearbyshare";
 
 // People section.
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 1e06df67..8b45167 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -729,6 +729,8 @@
        IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_SAVE_BUTTON_ARIA_LABEL},
       {"tabDiscardingExceptionsHeader",
        IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_HEADER},
+      {"tabDiscardingExceptionsAdditionalSites",
+       IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADDITIONAL_SITES},
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
index 4b0513e..c15ef04 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
@@ -34,6 +34,7 @@
       {"addANote", IDS_ADD_NEW_USER_NOTE_PLACEHOLDER_TEXT},
       {"allNotes", IDS_ALL_NOTES},
       {"cancel", IDS_CANCEL},
+      {"currentTab", IDS_USER_NOTES_CURRENT_TAB_HEADER},
       {"delete", IDS_DELETE},
       {"edit", IDS_EDIT},
       {"sortByType", IDS_BOOKMARKS_SORT_BY_TYPE},
diff --git a/chrome/browser/usb/web_usb_detector.cc b/chrome/browser/usb/web_usb_detector.cc
index c563d1f..f5ce91d4 100644
--- a/chrome/browser/usb/web_usb_detector.cc
+++ b/chrome/browser/usb/web_usb_detector.cc
@@ -43,6 +43,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/constants/notifier_catalogs.h"
+#include "chrome/browser/ash/crosapi/browser_util.h"
 #endif
 
 namespace {
@@ -192,6 +193,14 @@
   if (!base::FeatureList::IsEnabled(features::kWebUsbDeviceDetection))
     return;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Delegate to the Lacros browser if it is primary to prevent duplicate
+  // notifications.
+  if (crosapi::browser_util::IsLacrosPrimaryBrowser()) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
   // Tests may set a fake manager.
   if (!device_manager_) {
     // Receive mojo::Remote<UsbDeviceManager> from DeviceService.
diff --git a/chrome/browser/web_applications/web_app_command_manager.cc b/chrome/browser/web_applications/web_app_command_manager.cc
index 79dc94e..68a745a 100644
--- a/chrome/browser/web_applications/web_app_command_manager.cc
+++ b/chrome/browser/web_applications/web_app_command_manager.cc
@@ -41,8 +41,8 @@
   return dict;
 }
 
-base::Value CreateLogValue(const WebAppCommand& command,
-                           absl::optional<CommandResult> result) {
+base::Value::Dict CreateLogValue(const WebAppCommand& command,
+                                 absl::optional<CommandResult> result) {
   base::Value::Dict dict = CreateCommandMetadata(command);
   base::Value debug_value = command.ToDebugValue();
   bool is_empty_dict = debug_value.is_dict() && debug_value.DictEmpty();
@@ -62,7 +62,7 @@
         break;
     }
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
@@ -100,7 +100,8 @@
     return;
   }
   if (is_in_shutdown_) {
-    AddValueToLog(CreateLogValue(*command, CommandResult::kShutdown));
+    AddValueToLog(
+        base::Value(CreateLogValue(*command, CommandResult::kShutdown)));
     return;
   }
   DCHECK(!base::Contains(commands_, command->id()));
@@ -294,7 +295,7 @@
     CommandResult result,
     base::OnceClosure completion_callback) {
   DCHECK(running_command);
-  AddValueToLog(CreateLogValue(*running_command, result));
+  AddValueToLog(base::Value(CreateLogValue(*running_command, result)));
 
   auto command_it = commands_.find(running_command->id());
   DCHECK(command_it != commands_.end());
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index fd97202..a43207f0 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1677239935-5f24d4a6674fd00cdddaeac3c8414200aedb66b5.profdata
+chrome-linux-main-1677261545-f6c43e53725ae6bae614e4e9ecb3a2d8c33f2874.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 3c0fa32..4aa1157d 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1677254364-3aa6111f0d0795cf02c4cc10c36a150f5cb5f8f8.profdata
+chrome-mac-arm-main-1677275861-2d2542d5e3edcebab95629045106de345ec5ae33.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 2629e3a2..7f72b600 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1677239935-af300b326c8d58e955edeabbe8e8080653baf754.profdata
+chrome-mac-main-1677261545-6cc1d298a9feaf75ef9dfc5240d9ed83720cecd7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 847b6c8..438051e 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1677239935-54653207641c25728340b95b5389e1fe74983015.profdata
+chrome-win32-main-1677261545-38db2987eb6b45e47c40c5e7e836156e6d2dd6f7.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 7ea0bb3..57bc17c 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1677239935-22a841fb86bca601bf0b4c33a6f24baa08e97a87.profdata
+chrome-win64-main-1677261545-3d7ab441cfdab5c75845215dbf1ad736cbb942aa.profdata
diff --git a/chrome/chrome_cleaner/engines/target/libraries.cc b/chrome/chrome_cleaner/engines/target/libraries.cc
index e2f5aa5a..7cfd6ae 100644
--- a/chrome/chrome_cleaner/engines/target/libraries.cc
+++ b/chrome/chrome_cleaner/engines/target/libraries.cc
@@ -53,8 +53,7 @@
       LOG(ERROR) << "Failed to load " << name_id.first << " from resources";
       return false;
     }
-    if (base::WriteFile(extraction_dir.Append(name_id.first),
-                        library_data.data(), library_data.size()) < 0) {
+    if (!base::WriteFile(extraction_dir.Append(name_id.first), library_data)) {
       PLOG(ERROR) << "Failed to write " << name_id.first;
       return false;
     }
diff --git a/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc b/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
index 027cbc8..0a95bd18 100644
--- a/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
+++ b/chrome/chrome_cleaner/logging/cleaner_logging_service_unittest.cc
@@ -709,9 +709,7 @@
   ASSERT_TRUE(test_dir.CreateUniqueTempDir());
   base::CreateTemporaryFileInDir(test_dir.GetPath(), &test_file);
   ASSERT_TRUE(base::PathExists(test_file));
-  ASSERT_GT(base::WriteFile(test_file, raw_report_string.c_str(),
-                            raw_report_string.size()),
-            0);
+  ASSERT_TRUE(base::WriteFile(test_file, raw_report_string));
 
   EXPECT_TRUE(logging_service_->ReadContentFromFile(test_file));
 
@@ -745,7 +743,7 @@
   ASSERT_TRUE(test_dir.CreateUniqueTempDir());
   base::CreateTemporaryFileInDir(test_dir.GetPath(), &test_file);
   ASSERT_TRUE(base::PathExists(test_file));
-  ASSERT_GT(base::WriteFile(test_file, "bla", 3), 0);
+  ASSERT_TRUE(base::WriteFile(test_file, "bla"));
 
   EXPECT_FALSE(logging_service_->ReadContentFromFile(test_file));
 }
diff --git a/chrome/chrome_cleaner/logging/logging_service_api.cc b/chrome/chrome_cleaner/logging/logging_service_api.cc
index 106137e..1580dfc 100644
--- a/chrome/chrome_cleaner/logging/logging_service_api.cc
+++ b/chrome/chrome_cleaner/logging/logging_service_api.cc
@@ -52,7 +52,7 @@
                                      .InsertBeforeExtension(tag));
 
     std::string logs_proto = RawReportContent();
-    base::WriteFile(log_file_path, logs_proto.c_str(), logs_proto.length());
+    base::WriteFile(log_file_path, logs_proto);
   }
 }
 
diff --git a/chrome/chrome_cleaner/logging/pending_logs_service.cc b/chrome/chrome_cleaner/logging/pending_logs_service.cc
index 8517578..0fc1b3e2 100644
--- a/chrome/chrome_cleaner/logging/pending_logs_service.cc
+++ b/chrome/chrome_cleaner/logging/pending_logs_service.cc
@@ -66,8 +66,7 @@
   base::ScopedClosureRunner delete_file_closure(
       base::GetDeleteFileCallback(temp_file_path));
 
-  if (base::WriteFile(temp_file_path, chrome_cleaner_report_string.c_str(),
-                      chrome_cleaner_report_string.size()) <= 0) {
+  if (!base::WriteFile(temp_file_path, chrome_cleaner_report_string)) {
     PLOG(ERROR) << "Failed to write logging report to "
                 << SanitizePath(temp_file_path);
     return;
diff --git a/chrome/chrome_cleaner/logging/pending_logs_service_unittest.cc b/chrome/chrome_cleaner/logging/pending_logs_service_unittest.cc
index 9ac8493..7757328 100644
--- a/chrome/chrome_cleaner/logging/pending_logs_service_unittest.cc
+++ b/chrome/chrome_cleaner/logging/pending_logs_service_unittest.cc
@@ -213,9 +213,7 @@
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(scoped_temp_dir.GetPath(), &log_file));
   ASSERT_TRUE(base::PathExists(log_file));
-  ASSERT_GT(base::WriteFile(log_file, raw_report_string.c_str(),
-                            raw_report_string.size()),
-            0);
+  ASSERT_TRUE(base::WriteFile(log_file, raw_report_string));
 
   // Set it up as a pending log.
   ASSERT_TRUE(registry_logger_->AppendLogFilePath(log_file));
@@ -291,7 +289,7 @@
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(scoped_temp_dir.GetPath(), &invalid_file));
   ASSERT_TRUE(base::PathExists(invalid_file));
-  ASSERT_GT(base::WriteFile(invalid_file, "wat", 3), 0);
+  ASSERT_TRUE(base::WriteFile(invalid_file, "wat"));
 
   ValidatePendingLogsUploadFailure(invalid_file);
 }
diff --git a/chrome/chrome_cleaner/test/cleaner_test.cc b/chrome/chrome_cleaner/test/cleaner_test.cc
index 6326ce89..ceb4b1ff1 100644
--- a/chrome/chrome_cleaner/test/cleaner_test.cc
+++ b/chrome/chrome_cleaner/test/cleaner_test.cc
@@ -260,9 +260,8 @@
         startup_dir.Append(chrome_cleaner::kTestUwsBFilename));
 
     // Always create scan-only UwS. Only some tests will have removable UwS.
-    ASSERT_NE(-1, base::WriteFile(scan_only_test_uws_,
-                                  chrome_cleaner::kTestUwsAFileContents,
-                                  chrome_cleaner::kTestUwsAFileContentsSize));
+    ASSERT_TRUE(base::WriteFile(scan_only_test_uws_,
+                                chrome_cleaner::kTestUwsAFileContents));
 
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     InitializeRemovableUwSArchivePath();
@@ -291,9 +290,8 @@
   }
 
   void CreateRemovableUwS() {
-    ASSERT_NE(-1, base::WriteFile(removable_test_uws_,
-                                  chrome_cleaner::kTestUwsBFileContents,
-                                  chrome_cleaner::kTestUwsBFileContentsSize));
+    ASSERT_TRUE(base::WriteFile(removable_test_uws_,
+                                chrome_cleaner::kTestUwsBFileContents));
   }
 
   void LockRemovableUwS() {
diff --git a/chrome/chrome_cleaner/test/scoped_file.cc b/chrome/chrome_cleaner/test/scoped_file.cc
index 88e125b9..337b3705 100644
--- a/chrome/chrome_cleaner/test/scoped_file.cc
+++ b/chrome/chrome_cleaner/test/scoped_file.cc
@@ -19,8 +19,7 @@
   CHECK(base::PathExists(file_path.DirName()));
   CHECK_LE(contents.length(),
            static_cast<size_t>(std::numeric_limits<int>::max()));
-  base::WriteFile(file_path, contents.c_str(),
-                  static_cast<int>(contents.length()));
+  base::WriteFile(file_path, contents);
   return std::make_unique<ScopedFile>(file_path);
 }
 
diff --git a/chrome/chrome_cleaner/test/test_file_util.cc b/chrome/chrome_cleaner/test/test_file_util.cc
index c202b167..b91043725 100644
--- a/chrome/chrome_cleaner/test/test_file_util.cc
+++ b/chrome/chrome_cleaner/test/test_file_util.cc
@@ -65,7 +65,7 @@
     const std::wstring& file_name,
     const base::ScopedTempDir& temp_dir) {
   base::FilePath path(temp_dir.GetPath().Append(file_name));
-  EXPECT_NE(base::WriteFile(path, content.c_str(), content.size()), -1);
+  EXPECT_TRUE(base::WriteFile(path, content));
   std::wstring wide_file_path = path.value();
   base::win::ScopedHandle file_handle(
       ::CreateFile(wide_file_path.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,
diff --git a/chrome/chrome_cleaner/tools/generate_test_uws.cc b/chrome/chrome_cleaner/tools/generate_test_uws.cc
index 18580c4e..a9294d31 100644
--- a/chrome/chrome_cleaner/tools/generate_test_uws.cc
+++ b/chrome/chrome_cleaner/tools/generate_test_uws.cc
@@ -15,16 +15,14 @@
 
   base::FilePath google_test_a =
       startup_dir.Append(chrome_cleaner::kTestUwsAFilename);
-  if (base::WriteFile(google_test_a, chrome_cleaner::kTestUwsAFileContents,
-                      chrome_cleaner::kTestUwsAFileContentsSize) == -1) {
+  if (!base::WriteFile(google_test_a, chrome_cleaner::kTestUwsAFileContents)) {
     PLOG(ERROR) << "Failed to create test UwS at " << google_test_a;
     return 1;
   }
 
   base::FilePath google_test_b =
       startup_dir.Append(chrome_cleaner::kTestUwsBFilename);
-  if (base::WriteFile(google_test_b, chrome_cleaner::kTestUwsBFileContents,
-                      chrome_cleaner::kTestUwsBFileContentsSize) == -1) {
+  if (!base::WriteFile(google_test_b, chrome_cleaner::kTestUwsBFileContents)) {
     PLOG(ERROR) << "Failed to create test UwS at " << google_test_b;
     return 1;
   }
diff --git a/chrome/chrome_cleaner/zip_archiver/test_zip_archiver_util.cc b/chrome/chrome_cleaner/zip_archiver/test_zip_archiver_util.cc
index 418d510..89cb52f2 100644
--- a/chrome/chrome_cleaner/zip_archiver/test_zip_archiver_util.cc
+++ b/chrome/chrome_cleaner/zip_archiver/test_zip_archiver_util.cc
@@ -81,9 +81,7 @@
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &src_file_path_));
 
-  ASSERT_EQ(static_cast<size_t>(base::WriteFile(src_file_path_, kTestContent,
-                                                strlen(kTestContent))),
-            strlen(kTestContent));
+  ASSERT_TRUE(base::WriteFile(src_file_path_, kTestContent));
   // Set a fixed timestamp, so the modified time will be identical in every
   // test.
   base::Time file_time;
diff --git a/chrome/common/auto_start_linux.cc b/chrome/common/auto_start_linux.cc
index 65cf215..9d5def7 100644
--- a/chrome/common/auto_start_linux.cc
+++ b/chrome/common/auto_start_linux.cc
@@ -42,10 +42,7 @@
       "Terminal=" + terminal + "\n"
       "Exec=" + command_line + "\n"
       "Name=" + application_name + "\n";
-  std::string::size_type content_length = autostart_file_contents.length();
-  if (base::WriteFile(autostart_file, autostart_file_contents.c_str(),
-                      content_length) !=
-      static_cast<int>(content_length)) {
+  if (!base::WriteFile(autostart_file, autostart_file_contents)) {
     base::DeleteFile(autostart_file);
     return false;
   }
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index 348d1984..f5a8c92 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -664,6 +664,8 @@
     DOMString sinkType;
     // Whether the frame sink is the root.
     boolean isRoot;
+    // Debug label of the frame sink.
+    DOMString debugLabel;
 
     // Number of presented frames grouped using `bucketSizeInSeconds` arg in
     // startFrameCounting call. It would be fps if the `bucketSizeInSeconds` is
diff --git a/chrome/common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc b/chrome/common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc
index 7b52bde0..b08f62e 100644
--- a/chrome/common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc
+++ b/chrome/common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc
@@ -46,8 +46,7 @@
     if (schema.empty()) {
       base::DeleteFile(schema_path);
     } else {
-      if (base::WriteFile(schema_path, schema.data(), schema.size()) !=
-          static_cast<int>(schema.size())) {
+      if (!base::WriteFile(schema_path, schema)) {
         return nullptr;
       }
     }
diff --git a/chrome/common/importer/firefox_importer_utils_unittest.cc b/chrome/common/importer/firefox_importer_utils_unittest.cc
index e24e4ed..ff839f0e 100644
--- a/chrome/common/importer/firefox_importer_utils_unittest.cc
+++ b/chrome/common/importer/firefox_importer_utils_unittest.cc
@@ -115,8 +115,7 @@
       temp_dir.GetPath().AppendASCII("application.ini"));
   for (size_t i = 0; i < std::size(GetFirefoxImporterNameCases); ++i) {
     base::WriteFile(app_ini_file,
-                    GetFirefoxImporterNameCases[i].app_ini_content.c_str(),
-                    GetFirefoxImporterNameCases[i].app_ini_content.size());
+                    GetFirefoxImporterNameCases[i].app_ini_content);
     EXPECT_EQ(
         GetFirefoxImporterName(temp_dir.GetPath()),
         l10n_util::GetStringUTF16(GetFirefoxImporterNameCases[i].resource_id));
diff --git a/chrome/common/notifications/notification_image_retainer.cc b/chrome/common/notifications/notification_image_retainer.cc
index 9283645..32373ef 100644
--- a/chrome/common/notifications/notification_image_retainer.cc
+++ b/chrome/common/notifications/notification_image_retainer.cc
@@ -142,9 +142,7 @@
 
   // At this point, a temp file is already created. We need to clean it up even
   // if it fails to write the image data to this file.
-  int data_len = base::checked_cast<int>(data->size());
-  bool data_write_success = (base::WriteFile(temp_file, data->front_as<char>(),
-                                             data_len) == data_len);
+  bool data_write_success = base::WriteFile(temp_file, *data);
 
   // Start the timer if it hasn't to delete the expired files in batch. This
   // avoids creating a deletion task for each file, otherwise the overhead can
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 23e1e56..e57e816 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1564,9 +1564,6 @@
 // Preference storing Easy Unlock pairing data.
 const char kEasyUnlockPairing[] = "easy_unlock.pairing";
 
-const char kHasSeenSmartLockSignInRemovedNotification[] =
-    "easy_unlock.has_seen_smart_lock_sign_in_removed_notification";
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 // Used to indicate whether or not the toolbar redesign bubble has been shown
 // and acknowledged, and the last time the bubble was shown.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 319b43c..28f3ca3 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -512,7 +512,6 @@
 
 extern const char kEasyUnlockAllowed[];
 extern const char kEasyUnlockPairing[];
-extern const char kHasSeenSmartLockSignInRemovedNotification[];
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 extern const char kToolbarIconSurfacingBubbleAcknowledged[];
diff --git a/chrome/services/printing/print_backend_service_impl.cc b/chrome/services/printing/print_backend_service_impl.cc
index db015c9..a0a033fa 100644
--- a/chrome/services/printing/print_backend_service_impl.cc
+++ b/chrome/services/printing/print_backend_service_impl.cc
@@ -454,6 +454,18 @@
   locale_ = locale;
 }
 
+// Holds the context and associated delegate for persistent usage across
+// multiple settings calls until they are ready to be used to print a
+// document.  Required since `PrintingContext` does not own the corresponding
+// delegate object that it relies upon.
+struct PrintBackendServiceImpl::ContextContainer {
+  ContextContainer() = default;
+  ~ContextContainer() = default;
+
+  std::unique_ptr<PrintingContextDelegate> delegate;
+  std::unique_ptr<PrintingContext> context;
+};
+
 PrintBackendServiceImpl::PrintBackendServiceImpl(
     mojo::PendingReceiver<mojom::PrintBackendService> receiver)
     : receiver_(this, std::move(receiver)) {}
@@ -468,6 +480,7 @@
     const std::string& locale
 #endif  // BUILDFLAG(IS_WIN)
 ) {
+  locale_ = locale;
   context_delegate_.SetAppLocale(locale);
 #if BUILDFLAG(IS_WIN)
   if (remote.is_valid())
@@ -623,6 +636,28 @@
           std::move(caps_and_info)));
 }
 
+void PrintBackendServiceImpl::EstablishPrintingContext(uint32_t context_id
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+                                                       ,
+                                                       uint32_t parent_window_id
+#endif
+) {
+  auto context_container = std::make_unique<ContextContainer>();
+
+  context_container->delegate = CreatePrintingContextDelegate();
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+  context_container->delegate->SetParentWindow(parent_window_id);
+#endif
+
+  context_container->context = PrintingContext::Create(
+      context_container->delegate.get(), /*skip_system_calls=*/false);
+
+  bool inserted = persistent_printing_contexts_
+                      .insert({context_id, std::move(context_container)})
+                      .second;
+  DCHECK(inserted);
+}
+
 void PrintBackendServiceImpl::UseDefaultSettings(
     mojom::PrintBackendService::UseDefaultSettingsCallback callback) {
   // Use a one-time `PrintingContext` to get the print settings.
@@ -853,6 +888,13 @@
   RemoveDocumentHelper(document_helper);
 }
 
+std::unique_ptr<PrintBackendServiceImpl::PrintingContextDelegate>
+PrintBackendServiceImpl::CreatePrintingContextDelegate() {
+  auto context_delegate = std::make_unique<PrintingContextDelegate>();
+  context_delegate->SetAppLocale(locale_);
+  return context_delegate;
+}
+
 PrintBackendServiceImpl::DocumentHelper*
 PrintBackendServiceImpl::GetDocumentHelper(int document_cookie) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
diff --git a/chrome/services/printing/print_backend_service_impl.h b/chrome/services/printing/print_backend_service_impl.h
index de3cdc1..8f46953 100644
--- a/chrome/services/printing/print_backend_service_impl.h
+++ b/chrome/services/printing/print_backend_service_impl.h
@@ -9,6 +9,7 @@
 #include <string>
 #include <vector>
 
+#include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/memory/scoped_refptr.h"
@@ -110,6 +111,7 @@
   friend class PrintBackendServiceTestImpl;
 
   class DocumentHelper;
+  struct ContextContainer;
 
   class PrintingContextDelegate : public PrintingContext::Delegate {
    public:
@@ -156,6 +158,12 @@
   void FetchCapabilities(
       const std::string& printer_name,
       mojom::PrintBackendService::FetchCapabilitiesCallback callback) override;
+  void EstablishPrintingContext(uint32_t context_id
+#if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
+                                ,
+                                uint32_t parent_window_id
+#endif
+                                ) override;
   void UseDefaultSettings(
       mojom::PrintBackendService::UseDefaultSettingsCallback callback) override;
 #if BUILDFLAG(ENABLE_OOP_BASIC_PRINT_DIALOG)
@@ -211,6 +219,7 @@
                    mojom::PrintBackendService::CancelCallback callback);
 
   // Utility helpers.
+  std::unique_ptr<PrintingContextDelegate> CreatePrintingContextDelegate();
   DocumentHelper* GetDocumentHelper(int document_cookie);
   void RemoveDocumentHelper(DocumentHelper& document_helper);
 
@@ -221,6 +230,10 @@
       const std::string& printer_name);
 #endif  // BUILDFLAG(IS_WIN)
 
+  // The locale provided at initialization that should be used with all
+  // PrintingContext::Delegate instances.
+  std::string locale_;
+
   // Crash key is kept at class level so that we can obtain printer driver
   // information for a prior call should the process be terminated by the
   // remote.  This can happen in the case of Mojo message validation.
@@ -228,6 +241,12 @@
 
   scoped_refptr<PrintBackend> print_backend_;
 
+  // Map from a context ID to a printing device context.
+  base::flat_map<uint32_t, std::unique_ptr<ContextContainer>>
+      persistent_printing_contexts_;
+
+  // TODO(crbug.com/1414968):  Delete this once callers switch to complete
+  // local contexts or using `persistent_printing_contexts_`.
   PrintingContextDelegate context_delegate_;
 
   // Want all callbacks and document helper sequence manipulations to be made
diff --git a/chrome/services/printing/public/mojom/print_backend_service.mojom b/chrome/services/printing/public/mojom/print_backend_service.mojom
index 0d5991d..ee203bec 100644
--- a/chrome/services/printing/public/mojom/print_backend_service.mojom
+++ b/chrome/services/printing/public/mojom/print_backend_service.mojom
@@ -121,6 +121,27 @@
   FetchCapabilities(string printer_name)
     => (PrinterCapsAndInfoResult printer_caps_and_info);
 
+  // Creates a printing context that can persist across multiple calls.
+  // Necessary to ensure that the context used for system dialogs is still
+  // available by the time that printing is started.  The printing context
+  // is to be referenced by the provided `context_id` in all future calls that
+  // need to use it.
+  // Once an established printing context has been attached to a print job by
+  // calling StartPrinting() then it will be automatically cleaned up as a
+  // result of that print job completing successfully or being canceled.  It is
+  // automatically destroyed upon any failure during UseDefaultSettings() or
+  // AskUserForSettings().
+  // The `parent_window_id` parameter, for configurations where it is
+  // applicable, specifies an ID which is cross-process safe to represent the
+  // native window which owns the modal print dialog used for prompting the
+  // user. This can be needed if:
+  //   - The AskUserForSettings() call will be invoked.
+  //   - (Windows-specific)  If the job settings provided to StartPrinting()
+  //     signal to use a system dialog.
+  EstablishPrintingContext(uint32 context_id,
+                           [EnableIf=enable_oop_basic_print_dialog]
+                           uint32 parent_window_id);
+
   // Generates a print settings object based upon the default settings for the
   // default printer.
   UseDefaultSettings()
diff --git a/chrome/services/speech/soda/soda_client_unittest.cc b/chrome/services/speech/soda/soda_client_unittest.cc
index bad81ee..be77d3e 100644
--- a/chrome/services/speech/soda/soda_client_unittest.cc
+++ b/chrome/services/speech/soda/soda_client_unittest.cc
@@ -128,6 +128,9 @@
   auto bus = media::AudioBus::Create(handler->GetNumChannels(),
                                      handler->total_frames_for_testing());
 
+  size_t bytes_written = 0u;
+  ASSERT_TRUE(handler->CopyTo(bus.get(), &bytes_written));
+
   std::vector<int16_t> audio_data(bus->frames());
   bus->ToInterleaved<media::SignedInt16SampleTypeTraits>(bus->frames(),
                                                          audio_data.data());
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9bea2259..0c4bddf0 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -7038,6 +7038,7 @@
       "../browser/ui/webui/downloads/mock_downloads_page.cc",
       "../browser/ui/webui/downloads/mock_downloads_page.h",
       "../browser/ui/webui/favicon_source_unittest.cc",
+      "../browser/ui/webui/feedback/feedback_ui_unittest.cc",
       "../browser/ui/webui/flags/flags_ui_unittest.cc",
       "../browser/ui/webui/history/browsing_history_handler_unittest.cc",
       "../browser/ui/webui/history/foreign_session_handler_unittest.cc",
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index fd3b2b1..dfd50ca 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -310,7 +310,6 @@
       "cr_components/chromeos:closure_compile",
       "nearby_share:closure_compile",
       "nearby_share/shared:closure_compile",
-      "settings/chromeos:closure_compile",
     ]
   }
 }
diff --git a/chrome/test/data/webui/chromeos/BUILD.gn b/chrome/test/data/webui/chromeos/BUILD.gn
index 3f89733..b4dccd3c 100644
--- a/chrome/test/data/webui/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/BUILD.gn
@@ -83,7 +83,7 @@
 
   deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [ "//ash/webui/common/resources:generate_definitions" ]
 }
diff --git a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
index 107cb07..a950ae6b 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/personalization_app/BUILD.gn
@@ -66,7 +66,7 @@
     "//ash/webui/personalization_app/resources:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
 
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts
index e114a541..828caf6 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_observer_test.ts
@@ -137,38 +137,30 @@
   });
 
   test('sets to false if already received preview images', async () => {
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews = [];
-    ambientProvider.ambientObserverRemote!.onGooglePhotosAlbumsPreviewsFetched(
-        []);
-    personalizationStore.expectAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
-    await personalizationStore.waitForAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
+    personalizationStore.data.ambient.previews = [];
+    ambientProvider.ambientObserverRemote!.onPreviewsFetched([]);
+    personalizationStore.expectAction(AmbientActionName.SET_PREVIEWS);
+    await personalizationStore.waitForAction(AmbientActionName.SET_PREVIEWS);
     assertTrue(
         AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance,
         'still true because no previews stored yet');
 
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews = [
+    personalizationStore.data.ambient.previews = [
       {url: 'asdf'},
     ];
-    ambientProvider.ambientObserverRemote!.onGooglePhotosAlbumsPreviewsFetched(
-        []);
-    personalizationStore.expectAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
-    await personalizationStore.waitForAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
+    ambientProvider.ambientObserverRemote!.onPreviewsFetched([]);
+    personalizationStore.expectAction(AmbientActionName.SET_PREVIEWS);
+    await personalizationStore.waitForAction(AmbientActionName.SET_PREVIEWS);
     assertFalse(AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance);
   });
 
   test('sets to false after receiving preview images', async () => {
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews = [];
-    ambientProvider.ambientObserverRemote!.onGooglePhotosAlbumsPreviewsFetched([
+    personalizationStore.data.ambient.previews = [];
+    ambientProvider.ambientObserverRemote!.onPreviewsFetched([
       {url: 'asdf'},
     ]);
-    personalizationStore.expectAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
-    await personalizationStore.waitForAction(
-        AmbientActionName.SET_GOOGLE_PHOTOS_ALBUMS_PREVIEWS);
+    personalizationStore.expectAction(AmbientActionName.SET_PREVIEWS);
+    await personalizationStore.waitForAction(AmbientActionName.SET_PREVIEWS);
     assertFalse(AmbientObserver.shouldLogGooglePhotosPreviewsLoadPerformance);
   });
 });
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_large_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_large_element_test.ts
index a0effed..df56e597 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_large_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_large_element_test.ts
@@ -45,8 +45,7 @@
         personalizationStore.data.ambient.albums = ambientProvider.albums;
         personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
         personalizationStore.data.ambient.ambientModeEnabled = false;
-        personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-            ambientProvider.googlePhotosAlbumsPreviews;
+        personalizationStore.data.ambient.previews = ambientProvider.previews;
         ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
         personalizationStore.notifyObservers();
         await waitAfterNextRender(ambientPreviewLargeElement);
@@ -70,8 +69,7 @@
         personalizationStore.data.ambient.albums = ambientProvider.albums;
         personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
         personalizationStore.data.ambient.ambientModeEnabled = false;
-        personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-            ambientProvider.googlePhotosAlbumsPreviews;
+        personalizationStore.data.ambient.previews = ambientProvider.previews;
         ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
         personalizationStore.notifyObservers();
         await waitAfterNextRender(ambientPreviewLargeElement);
@@ -109,7 +107,7 @@
       albums: ambientProvider.albums,
       topicSource: TopicSource.kArtGallery,
       ambientModeEnabled: true,
-      googlePhotosAlbumsPreviews: ambientProvider.googlePhotosAlbumsPreviews,
+      previews: ambientProvider.previews,
     };
     ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
     personalizationStore.notifyObservers();
@@ -145,7 +143,7 @@
       albums: ambientProvider.albums,
       topicSource: TopicSource.kArtGallery,
       ambientModeEnabled: true,
-      googlePhotosAlbumsPreviews: ambientProvider.googlePhotosAlbumsPreviews,
+      previews: ambientProvider.previews,
     };
     ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
     personalizationStore.notifyObservers();
@@ -198,7 +196,7 @@
       albums: ambientProvider.albums,
       topicSource: TopicSource.kArtGallery,
       ambientModeEnabled: true,
-      googlePhotosAlbumsPreviews: ambientProvider.googlePhotosAlbumsPreviews,
+      previews: ambientProvider.previews,
     };
     ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
     personalizationStore.notifyObservers();
@@ -250,8 +248,7 @@
     personalizationStore.data.ambient.albums = ambientProvider.albums;
     personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
     personalizationStore.data.ambient.ambientModeEnabled = false;
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-        ambientProvider.googlePhotosAlbumsPreviews;
+    personalizationStore.data.ambient.previews = ambientProvider.previews;
     ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
     personalizationStore.notifyObservers();
     await waitAfterNextRender(ambientPreviewLargeElement);
@@ -278,8 +275,7 @@
     personalizationStore.data.ambient.albums = ambientProvider.albums;
     personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
     personalizationStore.data.ambient.ambientModeEnabled = false;
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-        ambientProvider.googlePhotosAlbumsPreviews;
+    personalizationStore.data.ambient.previews = ambientProvider.previews;
     ambientPreviewLargeElement = initElement(AmbientPreviewLarge);
     personalizationStore.notifyObservers();
     await waitAfterNextRender(ambientPreviewLargeElement);
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_small_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_small_element_test.ts
index 7b47b1e..64a0c3a 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_small_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_preview_small_element_test.ts
@@ -44,8 +44,7 @@
         personalizationStore.data.ambient.albums = ambientProvider.albums;
         personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
         personalizationStore.data.ambient.ambientModeEnabled = false;
-        personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-            ambientProvider.googlePhotosAlbumsPreviews;
+        personalizationStore.data.ambient.previews = ambientProvider.previews;
         ambientPreviewSmallElement = initElement(AmbientPreviewSmall);
         personalizationStore.notifyObservers();
         await waitAfterNextRender(ambientPreviewSmallElement);
@@ -89,8 +88,7 @@
     personalizationStore.data.ambient.albums = ambientProvider.albums;
     personalizationStore.data.ambient.topicSource = TopicSource.kArtGallery;
     personalizationStore.data.ambient.ambientModeEnabled = true;
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-        ambientProvider.googlePhotosAlbumsPreviews;
+    personalizationStore.data.ambient.previews = ambientProvider.previews;
     ambientPreviewSmallElement = initElement(AmbientPreviewSmall);
     personalizationStore.notifyObservers();
     await waitAfterNextRender(ambientPreviewSmallElement);
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
index fd2d1fff..15c7111c 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
@@ -55,14 +55,13 @@
       topicSource: TopicSource|null, temperatureUnit: TemperatureUnit|null,
       ambientModeEnabled: boolean|null,
       animationTheme = AnimationTheme.kSlideshow,
-      googlePhotosAlbumsPreviews: Url[] = []): Promise<AmbientSubpage> {
+      previews: Url[] = []): Promise<AmbientSubpage> {
     personalizationStore.data.ambient.albums = ambientProvider.albums;
     personalizationStore.data.ambient.animationTheme = animationTheme;
     personalizationStore.data.ambient.topicSource = topicSource;
     personalizationStore.data.ambient.temperatureUnit = temperatureUnit;
     personalizationStore.data.ambient.ambientModeEnabled = ambientModeEnabled;
-    personalizationStore.data.ambient.googlePhotosAlbumsPreviews =
-        googlePhotosAlbumsPreviews;
+    personalizationStore.data.ambient.previews = previews;
     const ambientSubpage =
         initElement(AmbientSubpage, {path: Paths.AMBIENT, queryParams: {}});
     personalizationStore.notifyObservers();
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
index 344609cb0..5cbfdf6 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_ambient_interface_provider.ts
@@ -47,7 +47,7 @@
     },
   ];
 
-  public googlePhotosAlbumsPreviews: Url[] = [
+  public previews: Url[] = [
     {url: 'http://preview0'},
     {url: 'http://preview1'},
     {url: 'http://preview2'},
@@ -92,8 +92,7 @@
     this.ambientObserverRemote!.onTopicSourceChanged(TopicSource.kArtGallery);
     this.ambientObserverRemote!.onTemperatureUnitChanged(
         TemperatureUnit.kFahrenheit);
-    this.ambientObserverRemote!.onGooglePhotosAlbumsPreviewsFetched(
-        this.googlePhotosAlbumsPreviews);
+    this.ambientObserverRemote!.onPreviewsFetched(this.previews);
   }
 
   setAmbientModeEnabled(ambientModeEnabled: boolean) {
diff --git a/chrome/test/data/webui/cr_components/BUILD.gn b/chrome/test/data/webui/cr_components/BUILD.gn
index 06c8892..dd174dcd 100644
--- a/chrome/test/data/webui/cr_components/BUILD.gn
+++ b/chrome/test/data/webui/cr_components/BUILD.gn
@@ -48,7 +48,7 @@
     "//ui/webui/resources/cr_components/most_visited:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   if (use_nss_certs) {
diff --git a/chrome/test/data/webui/js/BUILD.gn b/chrome/test/data/webui/js/BUILD.gn
index 3226c14..dfd55e4 100644
--- a/chrome/test/data/webui/js/BUILD.gn
+++ b/chrome/test/data/webui/js/BUILD.gn
@@ -22,6 +22,6 @@
   ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/test/data/webui/nearby_share/BUILD.gn b/chrome/test/data/webui/nearby_share/BUILD.gn
index 15590af..4fefa63f 100644
--- a/chrome/test/data/webui/nearby_share/BUILD.gn
+++ b/chrome/test/data/webui/nearby_share/BUILD.gn
@@ -42,8 +42,8 @@
                     "js_module_root=" + rebase_path(
                             "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/nearby_share/",
                             root_build_dir),
-                    "browser_resolver_prefix_replacements=\"chrome://nearby/mojo/=./\"",
-                    "browser_resolver_prefix_replacements=\"/mojo/=./\"",
+                    "browser_resolver_prefix_replacements=\"chrome://nearby/shared/mojo/=./\"",
+                    "browser_resolver_prefix_replacements=\"./shared/mojo/=./\"",
                   ]
   deps = [
     ":fake_mojo_interfaces",
diff --git a/chrome/test/data/webui/nearby_share/fake_mojo_interfaces.js b/chrome/test/data/webui/nearby_share/fake_mojo_interfaces.js
index 3024a61..77253b55 100644
--- a/chrome/test/data/webui/nearby_share/fake_mojo_interfaces.js
+++ b/chrome/test/data/webui/nearby_share/fake_mojo_interfaces.js
@@ -4,7 +4,7 @@
 
 /** @fileoverview Contains fake implementations of mojo interfaces. */
 
-import {ConfirmationManagerInterface, DiscoveryManagerInterface, DiscoveryObserverInterface, DiscoveryObserverRemote, PayloadPreview, SelectShareTargetResult, ShareTargetListenerRemote, StartDiscoveryResult, TransferUpdateListenerPendingReceiver, TransferUpdateListenerRemote} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
+import {ConfirmationManagerInterface, DiscoveryManagerInterface, DiscoveryObserverInterface, DiscoveryObserverRemote, PayloadPreview, SelectShareTargetResult, ShareTargetListenerRemote, StartDiscoveryResult, TransferUpdateListenerPendingReceiver, TransferUpdateListenerRemote} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {UnguessableToken} from 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js';
 
 import {TestBrowserProxy} from '../chromeos/test_browser_proxy.js';
diff --git a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
index a1979305..c5753cb4f 100644
--- a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
@@ -5,9 +5,9 @@
 // So that mojo is defined.
 import 'chrome://nearby/nearby_confirmation_page.js';
 
-import {ShareTarget, TransferStatus} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
-import {ShareType} from 'chrome://nearby/mojo/nearby_share_share_type.mojom-webui.js';
 import {NearbyConfirmationPageElement} from 'chrome://nearby/nearby_confirmation_page.js';
+import {ShareTarget, TransferStatus} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
+import {ShareType} from 'chrome://nearby/shared/mojo/nearby_share_share_type.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../chromeos/chai_assert.js';
diff --git a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
index 33f1439..228a7bca 100644
--- a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
@@ -6,9 +6,9 @@
 import 'chrome://nearby/nearby_discovery_page.js';
 
 import {setDiscoveryManagerForTesting} from 'chrome://nearby/discovery_manager.js';
-import {SelectShareTargetResult, ShareTarget, ShareTargetListenerRemote, StartDiscoveryResult} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
-import {ShareType} from 'chrome://nearby/mojo/nearby_share_share_type.mojom-webui.js';
 import {NearbyDiscoveryPageElement} from 'chrome://nearby/nearby_discovery_page.js';
+import {SelectShareTargetResult, ShareTarget, ShareTargetListenerRemote, StartDiscoveryResult} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
+import {ShareType} from 'chrome://nearby/shared/mojo/nearby_share_share_type.mojom-webui.js';
 import {getDeepActiveElement} from 'chrome://resources/ash/common/util.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 import {UnguessableToken} from 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/BUILD.gn b/chrome/test/data/webui/nearby_share/shared/BUILD.gn
index 87a8cb8f..d05b660 100644
--- a/chrome/test/data/webui/nearby_share/shared/BUILD.gn
+++ b/chrome/test/data/webui/nearby_share/shared/BUILD.gn
@@ -24,8 +24,8 @@
                     "js_module_root=" + rebase_path(
                             "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/nearby_share/",
                             root_build_dir),
-                    "browser_resolver_prefix_replacements=\"chrome://nearby/mojo/=./\"",
-                    "browser_resolver_prefix_replacements=\"/mojo/=./\"",
+                    "browser_resolver_prefix_replacements=\"chrome://nearby/shared/mojo/=./\"",
+                    "browser_resolver_prefix_replacements=\"./shared/mojo/=./\"",
                   ]
   deps = [
     ":fake_nearby_contact_manager",
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
index f358b29..2722e490 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_device_icon_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://nearby/shared/nearby_device_icon.js';
 
-import {ShareTarget} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
+import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 
 import {assertEquals} from '../../chromeos/chai_assert.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
index 07ba285..84fbe8edd 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_device_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://nearby/shared/nearby_device.js';
 
-import {ShareTarget} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
+import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 
 import {assertEquals} from '../../chromeos/chai_assert.js';
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
index b868373..fcf37e8 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_preview_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://nearby/shared/nearby_preview.js';
 
-import {ShareType} from 'chrome://nearby/mojo/nearby_share_share_type.mojom-webui.js';
+import {ShareType} from 'chrome://nearby/shared/mojo/nearby_share_share_type.mojom-webui.js';
 
 import {assertEquals} from '../../chromeos/chai_assert.js';
 
diff --git a/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js b/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
index f7ab87d..4ad81a2 100644
--- a/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
+++ b/chrome/test/data/webui/nearby_share/shared/nearby_progress_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://nearby/shared/nearby_progress.js';
 
-import {ShareTarget} from 'chrome://nearby/mojo/nearby_share.mojom-webui.js';
+import {ShareTarget} from 'chrome://nearby/shared/mojo/nearby_share.mojom-webui.js';
 import {ShareTargetType} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_target_types.mojom-webui.js';
 
 import {assertEquals} from '../../chromeos/chai_assert.js';
diff --git a/chrome/test/data/webui/new_tab_page/BUILD.gn b/chrome/test/data/webui/new_tab_page/BUILD.gn
index c59d9ca3..3b8dceb 100644
--- a/chrome/test/data/webui/new_tab_page/BUILD.gn
+++ b/chrome/test/data/webui/new_tab_page/BUILD.gn
@@ -48,6 +48,6 @@
     "//ui/webui/resources/cr_components/omnibox:build_ts",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 01a4fc4f..3b69d7d 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -4,24 +4,12 @@
 
 import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/grit/grit_rule.gni")
+import("//tools/grit/preprocess_if_expr.gni")
 import("//tools/typescript/ts_library.gni")
 
-js_type_check("closure_compile") {
-  deps = [
-    ":fake_settings_search_handler",
-    ":fake_user_action_recorder",
-  ]
-}
-
-js_library("fake_settings_search_handler") {
-  deps = [ "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js_library_for_compile" ]
-}
-
-js_library("fake_user_action_recorder") {
-  deps = [ "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js_library_for_compile" ]
-}
+preprocessed_folder = "preprocessed"
+tsc_folder = "tsc"
 
 mojom("test_api_mojom") {
   testonly = true
@@ -235,37 +223,46 @@
   "app_management/toggle_row_test.js",
 ]
 
-copy("copy_ts") {
-  sources = test_files
-  outputs = [ "$target_gen_dir/{{source_target_relative}}" ]
+preprocess_if_expr("preprocess") {
+  in_folder = "."
+  in_files = test_files
+  out_folder = "$target_gen_dir/$preprocessed_folder"
 }
 
-copy("copy_mojo") {
-  sources = [ "$root_gen_dir/mojom-webui/chrome/test/data/webui/settings/chromeos/test_api.test-mojom-webui.js" ]
-  outputs = [ "$target_gen_dir/{{source_file_part}}" ]
+copy("copy_mojom") {
   deps = [ ":test_api_mojom_webui_js" ]
+  sources = [ "$root_gen_dir/mojom-webui/chrome/test/data/webui/settings/chromeos/test_api.test-mojom-webui.js" ]
+  outputs = [ "$target_gen_dir/$preprocessed_folder/{{source_file_part}}" ]
 }
 
 ts_library("build_ts") {
   allow_js = true
-  root_dir = target_gen_dir
-  out_dir = "$target_gen_dir/tsc"
-  in_files = [ "test_api.test-mojom-webui.js" ] + test_files
+  tsconfig_base = "tsconfig_base.json"
+  root_dir = "$target_gen_dir/$preprocessed_folder"
+  out_dir = "$target_gen_dir/$tsc_folder"
+  in_files = test_files + [ "test_api.test-mojom-webui.js" ]
   deps = [
     "//ash/webui/common/resources/hotspot:build_ts",
     "//chrome/browser/resources/settings/chromeos:build_ts",
     "//chrome/test/data/webui:build_ts",
     "//ui/webui/resources/cr_components/app_management:build_ts",
+    "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [
-    ":copy_mojo",
-    ":copy_ts",
+    ":copy_mojom",
+    ":preprocess",
   ]
-  path_mappings = [ "chrome://webui-test/*|" +
-                    rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
-                                target_gen_dir) ]
+  path_mappings = [
+    "chrome://webui-test/*|" +
+        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
+                    target_gen_dir),
+    "chrome://os-settings/*|" + rebase_path(
+            "$root_gen_dir/chrome/browser/resources/settings/chromeos/tsc/*",
+            target_gen_dir),
+  ]
+  definitions = ts_definition_files
 }
 
 generate_grd("build_grdp") {
diff --git a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
index 1fee3be..1581dfe 100644
--- a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
+++ b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
@@ -6,10 +6,18 @@
  * @fileoverview Fake implementation of ReceiveManagerInterface for testing.
  */
 
-import {ReceiveManagerInterface, ReceiveObserverInterface, ReceiveObserverRemote, RegisterReceiveSurfaceResult, TransferStatus} from 'chrome://os-settings/mojo/nearby_share.mojom-webui.js';
+import {nearbyShareMojom} from 'chrome://os-settings/chromeos/os_settings.js';
 import {UnguessableToken} from 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-webui.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
+const {
+  ReceiveManagerInterface,
+  ReceiveObserverInterface,
+  ReceiveObserverRemote,
+  RegisterReceiveSurfaceResult,
+  TransferStatus,
+} = nearbyShareMojom;
+
 /**
  * Fake implementation of ReceiveManagerInterface
  *
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_confirm_page_test.js b/chrome/test/data/webui/settings/chromeos/nearby_share_confirm_page_test.js
index 3f74582..9da0e36 100644
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_confirm_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_confirm_page_test.js
@@ -4,9 +4,11 @@
 
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import {TransferStatus} from 'chrome://os-settings/mojo/nearby_share.mojom-webui.js';
+import {nearbyShareMojom} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+const {TransferStatus} = nearbyShareMojom;
+
 suite('NearbyShare', function() {
   let nearbyShareConfirmPage;
 
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_high_visibility_page_test.js b/chrome/test/data/webui/settings/chromeos/nearby_share_high_visibility_page_test.js
index c0a6f8f..caaa739 100644
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_high_visibility_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_high_visibility_page_test.js
@@ -4,9 +4,11 @@
 
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import {RegisterReceiveSurfaceResult} from 'chrome://os-settings/mojo/nearby_share.mojom-webui.js';
+import {nearbyShareMojom} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+const {RegisterReceiveSurfaceResult} = nearbyShareMojom;
+
 suite('NearbyShare', function() {
   let nearbyShareHighVisibilityPage;
 
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
index 4679508..465b282 100644
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {NearbyAccountManagerBrowserProxyImpl, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
-import {RegisterReceiveSurfaceResult} from 'chrome://os-settings/mojo/nearby_share.mojom-webui.js';
+import {NearbyAccountManagerBrowserProxyImpl, nearbyShareMojom, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
 import {DeviceNameValidationResult, FastInitiationNotificationState} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals} from 'chrome://webui-test/chai_assert.js';
@@ -15,6 +14,8 @@
 
 import {FakeReceiveManager} from './fake_receive_manager.js';
 
+const {RegisterReceiveSurfaceResult} = nearbyShareMojom;
+
 /** @implements {AccountManagerBrowserProxy} */
 class TestAccountManagerBrowserProxy extends TestBrowserProxy {
   constructor() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index aa40cff2..8b06e20 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -99,22 +99,6 @@
     'OSSettingsPeoplePageAccountManagerWithArcAccountRestrictionsEnabledV3Test',
     'All', () => mocha.run());
 
-var OSSettingsNearbyShareSubPageV3Test = class extends OSSettingsV3BrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/nearby_share_subpage_tests.js';
-  }
-
-  /** @override */
-  get featureList() {
-    return {
-      enabled: super.featureList.enabled.concat(['features::kNearbySharing']),
-    };
-  }
-};
-
-TEST_F('OSSettingsNearbyShareSubPageV3Test', 'All', () => mocha.run());
-
 var OSSettingsPeoplePageOsSyncV3Test = class extends OSSettingsV3BrowserTest {
   /** @override */
   get browsePreload() {
@@ -456,6 +440,11 @@
  ['NearbyShareConfirmPage', 'nearby_share_confirm_page_test.js'],
  ['NearbyShareHighVisibilityPage', 'nearby_share_high_visibility_page_test.js'],
  ['NearbyShareReceiveDialog', 'nearby_share_receive_dialog_tests.js'],
+ [
+   'NearbyShareSubpage',
+   'nearby_share_subpage_tests.js',
+   {enabled: ['features::kNearbySharing']},
+ ],
  ['NetworkAlwaysOnVpn', 'network_always_on_vpn_test.js'],
  ['NetworkProxySection', 'network_proxy_section_test.js'],
  ['NetworkSummary', 'network_summary_test.js'],
diff --git a/chrome/test/data/webui/settings/chromeos/tsconfig_base.json b/chrome/test/data/webui/settings/chromeos/tsconfig_base.json
new file mode 100644
index 0000000..d7bf06d
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/tsconfig_base.json
@@ -0,0 +1,11 @@
+{
+    "extends": "../../../../../../tools/typescript/tsconfig_base.json",
+    "compilerOptions": {
+      "typeRoots": [
+        "../../../../../../third_party/node/node_modules/@types"
+      ],
+      "types": [
+        "mocha"
+      ]
+    }
+  }
diff --git a/chrome/test/data/webui/settings/performance_page_test.ts b/chrome/test/data/webui/settings/performance_page_test.ts
index a9447bd..3878754 100644
--- a/chrome/test/data/webui/settings/performance_page_test.ts
+++ b/chrome/test/data/webui/settings/performance_page_test.ts
@@ -6,8 +6,9 @@
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {CrIconButtonElement} from 'chrome://settings/lazy_load.js';
-import {HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeExceptionListAction, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsPerformancePageElement, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_PREF, TabDiscardExceptionDialogElement, TabDiscardExceptionEntryElement, TabDiscardExceptionListElement} from 'chrome://settings/settings.js';
+import {HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeExceptionListAction, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsPerformancePageElement, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TAB_DISCARD_EXCEPTIONS_PREF, TabDiscardExceptionDialogElement, TabDiscardExceptionEntryElement, TabDiscardExceptionListElement} from 'chrome://settings/settings.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {TestPerformanceBrowserProxy} from './test_performance_browser_proxy.js';
 import {TestPerformanceMetricsProxy} from './test_performance_metrics_proxy.js';
@@ -94,9 +95,10 @@
   });
 
   function assertExceptionListEquals(rules: string[], message?: string) {
-    assertDeepEquals(
-        rules, tabDiscardExceptionsList.$.list.items!.map(entry => entry.site),
-        message);
+    const actual = tabDiscardExceptionsList.$.list.items!
+                       .concat(tabDiscardExceptionsList.$.overflowList.items!)
+                       .map(entry => entry.site);
+    assertDeepEquals(rules, actual, message);
   }
 
   function setupExceptionListEntries(rules: string[], managedRules?: string[]) {
@@ -112,7 +114,7 @@
   function getExceptionListEntry(idx: number): TabDiscardExceptionEntryElement {
     const entry = [...tabDiscardExceptionsList.shadowRoot!
                        .querySelectorAll<TabDiscardExceptionEntryElement>(
-                           'tab-discard-exception-entry:not([hidden])')][idx];
+                           'tab-discard-exception-entry')][idx];
     assertTrue(!!entry);
     return entry;
   }
@@ -150,54 +152,38 @@
     assertTrue(tabDiscardExceptionsList.$.noSitesAdded.hidden);
   });
 
-  test('testTabDiscardExceptionsManagedList', function(done) {
+  test('testTabDiscardExceptionsManagedList', function() {
     const userRules = 3;
     const managedRules = 3;
-    // Need to wait until updateScrollableContents updates the list with the
-    // correct items before making assertions on them.
-    const resizeListener = function() {
-      flush();
-      if (tabDiscardExceptionsList.shadowRoot!
-              .querySelectorAll('tab-discard-exception-entry:not([hidden])')
-              .length !== userRules + managedRules) {
-        return;
-      }
-
-      const managedRule = getExceptionListEntry(0);
-      assertTrue(managedRule.entry.managed);
-      const indicator =
-          managedRule.shadowRoot!.querySelector('cr-policy-pref-indicator');
-      assertTrue(!!indicator);
-      assertFalse(!!managedRule.shadowRoot!.querySelector('cr-icon-button'));
-
-      const tooltip =
-          tabDiscardExceptionsList.$.tooltip.shadowRoot!.querySelector(
-              '#tooltip');
-      assertTrue(!!tooltip);
-      assertTrue(tooltip.classList.contains('hidden'));
-      indicator.dispatchEvent(new Event('focus'));
-      assertEquals(
-          CrPolicyStrings.controlledSettingPolicy,
-          tabDiscardExceptionsList.$.tooltip.textContent!.trim());
-      assertFalse(tooltip.classList.contains('hidden'));
-      assertEquals(indicator, tabDiscardExceptionsList.$.tooltip.target);
-
-      const userRule = getExceptionListEntry(managedRules);
-      assertFalse(userRule.entry.managed);
-      assertFalse(
-          !!userRule.shadowRoot!.querySelector('cr-policy-pref-indicator'));
-      assertTrue(!!userRule.shadowRoot!.querySelector('cr-icon-button'));
-
-      tabDiscardExceptionsList.removeEventListener(
-          'iron-resize', resizeListener);
-      done();
-    };
-    tabDiscardExceptionsList.addEventListener('iron-resize', resizeListener);
     setupExceptionListEntries(
         [...Array(userRules).keys()].map(index => `user.rule${index}`),
         [...Array(managedRules).keys()].map(index => `managed.rule${index}`));
-  });
 
+    const managedRule = getExceptionListEntry(0);
+    assertTrue(managedRule.entry.managed);
+    const indicator =
+        managedRule.shadowRoot!.querySelector('cr-policy-pref-indicator');
+    assertTrue(!!indicator);
+    assertFalse(!!managedRule.shadowRoot!.querySelector('cr-icon-button'));
+
+    const tooltip =
+        tabDiscardExceptionsList.$.tooltip.shadowRoot!.querySelector(
+            '#tooltip');
+    assertTrue(!!tooltip);
+    assertTrue(tooltip.classList.contains('hidden'));
+    indicator.dispatchEvent(new Event('focus'));
+    assertEquals(
+        CrPolicyStrings.controlledSettingPolicy,
+        tabDiscardExceptionsList.$.tooltip.textContent!.trim());
+    assertFalse(tooltip.classList.contains('hidden'));
+    assertEquals(indicator, tabDiscardExceptionsList.$.tooltip.target);
+
+    const userRule = getExceptionListEntry(managedRules);
+    assertFalse(userRule.entry.managed);
+    assertFalse(
+        !!userRule.shadowRoot!.querySelector('cr-policy-pref-indicator'));
+    assertTrue(!!userRule.shadowRoot!.querySelector('cr-icon-button'));
+  });
 
   test('testTabDiscardExceptionsListDelete', async function() {
     setupExceptionListEntries(['foo', 'bar']);
@@ -206,10 +192,9 @@
     clickDeleteMenuItem();
     flush();
     assertExceptionListEquals(['bar']);
-
-    const action =
-        await performanceMetricsProxy.whenCalled('recordExceptionListAction');
-    assertEquals(HighEfficiencyModeExceptionListAction.REMOVE, action);
+    assertEquals(
+        HighEfficiencyModeExceptionListAction.REMOVE,
+        await performanceMetricsProxy.whenCalled('recordExceptionListAction'));
 
     clickMoreActionsButton(getExceptionListEntry(0));
     clickDeleteMenuItem();
@@ -222,44 +207,47 @@
         'tab-discard-exception-dialog');
   }
 
+  async function inputDialog(
+      dialog: TabDiscardExceptionDialogElement, input: string) {
+    const inputEvent = eventToPromise('input', dialog.$.input);
+    dialog.$.input.value = input;
+    dialog.$.input.dispatchEvent(new CustomEvent('input'));
+    await inputEvent;
+    dialog.$.actionButton.click();
+  }
+
   test('testTabDiscardExceptionsListAdd', async function() {
     setupExceptionListEntries(['foo']);
     let addDialog = getDialog();
-    assertFalse(!!addDialog, 'dialog should not exist by default');
+    assertFalse(!!addDialog);
 
     tabDiscardExceptionsList.$.addButton.click();
     flush();
 
     addDialog = getDialog();
-    assertTrue(
-        !!addDialog, 'add dialog should exist after clicking add button');
-    assertTrue(
-        addDialog.$.dialog.open,
-        'add dialog should be opened after clicking add button');
-    assertEquals(
-        '', addDialog.$.input.value,
-        'add dialog input should be empty initially');
+    assertTrue(!!addDialog);
+    assertTrue(addDialog.$.dialog.open);
+    assertEquals('', addDialog.$.input.value);
+    await inputDialog(addDialog, 'bar');
+    assertExceptionListEquals(['foo', 'bar']);
   });
 
   test('testTabDiscardExceptionsListEdit', async function() {
     setupExceptionListEntries(['foo', 'bar']);
     const entry = getExceptionListEntry(1);
     let editDialog = getDialog();
-    assertFalse(!!editDialog, 'dialog should not exist by default');
+    assertFalse(!!editDialog);
 
     clickMoreActionsButton(entry);
     clickEditMenuItem();
     flush();
 
     editDialog = getDialog();
-    assertTrue(
-        !!editDialog, 'edit dialog should exist after clicking edit button');
-    assertTrue(
-        editDialog.$.dialog.open,
-        'edit dialog should be opened after clicking edit button');
-    assertEquals(
-        entry.entry.site, editDialog.$.input.value,
-        'edit dialog input should be populated initially');
+    assertTrue(!!editDialog);
+    assertTrue(editDialog.$.dialog.open);
+    assertEquals(entry.entry.site, editDialog.$.input.value);
+    await inputDialog(editDialog, 'baz');
+    assertExceptionListEquals(['foo', 'baz']);
   });
 
   test('testTabDiscardExceptionsListAddAfterMenuClick', function() {
@@ -270,8 +258,77 @@
 
     const dialog = getDialog();
     assertTrue(!!dialog);
-    assertEquals(
-        '', dialog.$.input.value,
-        'add dialog should be opened instead of edit dialog');
+    assertEquals('', dialog.$.input.value);
+  });
+
+  test('testTabDiscardExceptionsListOverflow', async function() {
+    assertTrue(tabDiscardExceptionsList.$.expandButton.hidden);
+
+    const entries = [
+      ...Array(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE + 1).keys(),
+    ].map(index => `rule${index}`);
+    setupExceptionListEntries([...entries]);
+    assertFalse(tabDiscardExceptionsList.$.collapse.opened);
+    assertFalse(tabDiscardExceptionsList.$.expandButton.hidden);
+
+    tabDiscardExceptionsList.$.expandButton.click();
+    assertTrue(tabDiscardExceptionsList.$.collapse.opened);
+
+    tabDiscardExceptionsList.$.expandButton.click();
+    assertFalse(tabDiscardExceptionsList.$.collapse.opened);
+
+    tabDiscardExceptionsList.$.addButton.click();
+    flush();
+
+    const newRule = `rule${TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE + 1}`;
+    const addDialog = getDialog();
+    assertTrue(!!addDialog);
+    await inputDialog(addDialog, newRule);
+    assertTrue(tabDiscardExceptionsList.$.collapse.opened);
+    assertExceptionListEquals([...entries, newRule]);
+  });
+
+  test('testTabDiscardExceptionsListOverflowEdit', async function() {
+    const entries = [
+      ...Array(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE + 1).keys(),
+    ].map(index => `rule${index}`);
+    setupExceptionListEntries([...entries]);
+
+    const entry = getExceptionListEntry(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE);
+    clickMoreActionsButton(entry);
+    clickEditMenuItem();
+    flush();
+    const editDialog = getDialog();
+    assertTrue(!!editDialog);
+    assertEquals(entry.entry.site, editDialog.$.input.value);
+    await inputDialog(editDialog, 'foo');
+    assertExceptionListEquals([...entries.slice(0, -1), 'foo']);
+
+    clickMoreActionsButton(entry);
+    clickEditMenuItem();
+    flush();
+    assertTrue(!!editDialog);
+    await inputDialog(editDialog, getExceptionListEntry(0).entry.site);
+    assertExceptionListEquals(entries.slice(0, -1));
+  });
+
+  test('testTabDiscardExceptionsListOverflowDelete', function() {
+    const entries = [
+      ...Array(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE + 2).keys(),
+    ].map(index => `rule${index}`);
+    setupExceptionListEntries([...entries]);
+
+    let entry =
+        getExceptionListEntry(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE + 1);
+    clickMoreActionsButton(entry);
+    clickDeleteMenuItem();
+    flush();
+    assertExceptionListEquals(entries.slice(0, -1));
+
+    entry = getExceptionListEntry(TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE);
+    clickMoreActionsButton(entry);
+    clickDeleteMenuItem();
+    flush();
+    assertExceptionListEquals(entries.slice(0, -2));
   });
 });
diff --git a/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts b/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
index 1d187bd..f263d40 100644
--- a/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
+++ b/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
@@ -171,6 +171,12 @@
     assertEquals(HighEfficiencyModeExceptionListAction.ADD, action);
   });
 
+  test('testTabDiscardExceptionsAddDialogSubmitExisting', async function() {
+    setupAddDialog();
+    await assertUserInputValidated(EXISTING_RULE);
+    await assertSubmit([EXISTING_RULE]);
+  });
+
   test('testTabDiscardExceptionsEditDialogSubmit', async function() {
     setupEditDialog();
     await assertUserInputValidated(VALID_RULE);
@@ -179,4 +185,12 @@
         await performanceMetricsProxy.whenCalled('recordExceptionListAction');
     assertEquals(HighEfficiencyModeExceptionListAction.EDIT, action);
   });
+
+  test('testTabDiscardExceptionsEditDialogSubmitExisting', async function() {
+    dialog.setPrefValue(
+        TAB_DISCARD_EXCEPTIONS_PREF, [EXISTING_RULE, VALID_RULE]);
+    setupEditDialog();
+    await assertUserInputValidated(VALID_RULE);
+    await assertSubmit([VALID_RULE]);
+  });
 });
diff --git a/chrome/test/data/webui/side_panel/BUILD.gn b/chrome/test/data/webui/side_panel/BUILD.gn
index 87d6d2a..c8847aaf 100644
--- a/chrome/test/data/webui/side_panel/BUILD.gn
+++ b/chrome/test/data/webui/side_panel/BUILD.gn
@@ -57,6 +57,6 @@
     "//chrome/browser/resources/side_panel/reading_list:build_ts",
     "//chrome/browser/resources/side_panel/user_notes:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/test/data/webui/side_panel/user_notes/user_note_overviews_list_test.ts b/chrome/test/data/webui/side_panel/user_notes/user_note_overviews_list_test.ts
index 84fb447..111bdf6 100644
--- a/chrome/test/data/webui/side_panel/user_notes/user_note_overviews_list_test.ts
+++ b/chrome/test/data/webui/side_panel/user_notes/user_note_overviews_list_test.ts
@@ -5,6 +5,8 @@
 import 'chrome://webui-test/mojo_webui_test_support.js';
 import 'chrome://user-notes-side-panel.top-chrome/user_note_overviews_list.js';
 
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {UserNoteOverviewRowElement} from 'chrome://user-notes-side-panel.top-chrome/user_note_overview_row.js';
 import {UserNoteOverviewsListElement} from 'chrome://user-notes-side-panel.top-chrome/user_note_overviews_list.js';
 import {NoteOverview} from 'chrome://user-notes-side-panel.top-chrome/user_notes.mojom-webui.js';
 import {UserNotesApiProxyImpl} from 'chrome://user-notes-side-panel.top-chrome/user_notes_api_proxy.js';
@@ -36,7 +38,7 @@
     },
   ];
 
-  function queryNoteOverviews() {
+  function queryNoteOverviews(): NodeListOf<UserNoteOverviewRowElement> {
     return userNoteOverviewsList.shadowRoot!.querySelectorAll(
         'user-note-overview-row');
   }
@@ -47,6 +49,10 @@
     testProxy = new TestUserNotesApiProxy();
     UserNotesApiProxyImpl.setInstance(testProxy);
     testProxy.setNoteOverviews(noteOverviews);
+    loadTimeData.resetForTesting({
+      currentTab: 'Current Tab',
+      allNotes: 'All Notes',
+    });
 
     userNoteOverviewsList = document.createElement('user-note-overviews-list');
     userNoteOverviewsList.overviews = noteOverviews;
@@ -64,4 +70,14 @@
           noteOverviews[i]!.title);
     }
   });
+
+  test('headers and separator shown', () => {
+    const noteOverviewElements = queryNoteOverviews();
+    assertEquals(noteOverviewElements.length, 2);
+    const headers =
+        userNoteOverviewsList.shadowRoot!.querySelectorAll('sp-heading');
+    assertEquals(headers.length, 2);
+    const separator = userNoteOverviewsList.shadowRoot!.querySelectorAll('.hr');
+    assertEquals(separator.length, 1);
+  });
 });
\ No newline at end of file
diff --git a/chrome/test/data/webui/tab_search/BUILD.gn b/chrome/test/data/webui/tab_search/BUILD.gn
index 6e50e78..d409358 100644
--- a/chrome/test/data/webui/tab_search/BUILD.gn
+++ b/chrome/test/data/webui/tab_search/BUILD.gn
@@ -32,6 +32,6 @@
   ts_deps = [
     "//chrome/browser/resources/tab_search:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/chrome/test/enterprise/e2e/.vpython3 b/chrome/test/enterprise/e2e/.vpython3
index 03033bb..a934a2a 100644
--- a/chrome/test/enterprise/e2e/.vpython3
+++ b/chrome/test/enterprise/e2e/.vpython3
@@ -22,8 +22,8 @@
 
 wheel: <
   name: "infra/celab/celab/windows-amd64"
-  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8788328009316362273
-  version: "kFDyngPTacjAc-DvTxVpYFhyAUf335vtc6s_0-ugtLsC"
+  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8788316187917022081
+  version: "3Bf4lfq8pjw9hWQbJG1pguPoFb-rSn4r7rxx4HAAfmMC"
 >
 
 # googleapiclient
diff --git a/chrome/tools/convert_dict/convert_dict_unittest.cc b/chrome/tools/convert_dict/convert_dict_unittest.cc
index fa275e2..3f16903 100644
--- a/chrome/tools/convert_dict/convert_dict_unittest.cc
+++ b/chrome/tools/convert_dict/convert_dict_unittest.cc
@@ -82,11 +82,11 @@
   // Create a temporary affix file and a dictionary file from the test data.
   base::FilePath aff_file;
   base::CreateTemporaryFile(&aff_file);
-  base::WriteFile(aff_file, aff_data.c_str(), aff_data.length());
+  base::WriteFile(aff_file, aff_data);
 
   base::FilePath dic_file;
   base::CreateTemporaryFile(&dic_file);
-  base::WriteFile(dic_file, dic_data.c_str(), dic_data.length());
+  base::WriteFile(dic_file, dic_data);
 
   {
     // Read the above affix file with AffReader and read the dictionary file
diff --git a/chrome/tools/safe_browsing/sb_sigutil.cc b/chrome/tools/safe_browsing/sb_sigutil.cc
index 3338e13e..d87b2858 100644
--- a/chrome/tools/safe_browsing/sb_sigutil.cc
+++ b/chrome/tools/safe_browsing/sb_sigutil.cc
@@ -44,11 +44,8 @@
                             &signature_info);
 
   std::string serialized_info = signature_info.SerializeAsString();
-  int bytes_written = base::WriteFile(
-      cmd_line->GetSwitchValuePath(kOutputFile),
-      serialized_info.data(),
-      serialized_info.size());
-  if (bytes_written != static_cast<int>(serialized_info.size())) {
+  if (!base::WriteFile(cmd_line->GetSwitchValuePath(kOutputFile),
+                       serialized_info)) {
     LOG(ERROR) << "Error writing output file";
     return 1;
   }
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index 1c17f254..2bfe039 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -483,6 +483,8 @@
       "-e",
       "LEGACY_GOOGLE_UPDATE_APPID=\"$legacy_google_update_appid\"",
       "-e",
+      "LEGACY_SERVICE_NAME_PREFIX=\"$legacy_service_name_prefix\"",
+      "-e",
       "PREFS_ACCESS_MUTEX=\"$prefs_access_mutex\"",
     ]
 
diff --git a/chrome/updater/app/server/win/server.cc b/chrome/updater/app/server/win/server.cc
index 2fa8bbf9..4719125a6 100644
--- a/chrome/updater/app/server/win/server.cc
+++ b/chrome/updater/app/server/win/server.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/updater/app/server/win/server.h"
 
+#include <regstr.h>
 #include <wrl/module.h>
 
 #include <memory>
@@ -12,6 +13,7 @@
 
 #include "base/check.h"
 #include "base/command_line.h"
+#include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
@@ -36,6 +38,7 @@
 #include "chrome/updater/util/win_util.h"
 #include "chrome/updater/win/setup/setup_util.h"
 #include "chrome/updater/win/setup/uninstall.h"
+#include "chrome/updater/win/task_scheduler.h"
 #include "chrome/updater/win/win_constants.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -167,6 +170,61 @@
   return SwapUninstallCmdLine(scope, updater_path, root, list);
 }
 
+// Uninstall the GoogleUpdate services, run values, scheduled tasks, and files.
+bool UninstallGoogleUpdate(UpdaterScope scope,
+                           const base::FilePath& updater_path,
+                           const base::FilePath& temp_path,
+                           HKEY root) {
+  if (IsSystemInstall(scope)) {
+    // Delete the GoogleUpdate services.
+    ForEachServiceWithPrefix(
+        kLegacyServiceNamePrefix, kLegacyServiceDisplayNamePrefix,
+        base::BindRepeating([](const std::wstring& service_name) {
+          if (!DeleteService(service_name)) {
+            VLOG(1) << __func__
+                    << ": failed to delete service: " << service_name;
+          }
+        }));
+  } else {
+    // Delete the GoogleUpdate run values.
+    ForEachRegistryRunValueWithPrefix(
+        kLegacyRunValuePrefix,
+        base::BindRepeating([](const std::wstring& run_name) {
+          base::win::RegKey(HKEY_CURRENT_USER, REGSTR_PATH_RUN, KEY_WRITE)
+              .DeleteValue(run_name.c_str());
+        }));
+  }
+
+  // Delete the GoogleUpdate tasks.
+  scoped_refptr<TaskScheduler> task_scheduler(
+      TaskScheduler::CreateInstance(scope, /*use_task_subfolders=*/false));
+  task_scheduler->ForEachTaskWithPrefix(
+      IsSystemInstall(scope) ? kLegacyTaskNamePrefixSystem
+                             : kLegacyTaskNamePrefixUser,
+      base::BindRepeating(
+          [](scoped_refptr<TaskScheduler> task_scheduler,
+             const std::wstring& task_name) {
+            task_scheduler->DeleteTask(task_name.c_str());
+          },
+          task_scheduler));
+
+  // Delete the GoogleUpdate subdirectories.
+  const absl::optional<base::FilePath> target_path =
+      GetGoogleUpdateExePath(scope);
+  if (!target_path) {
+    return false;
+  }
+
+  base::FileEnumerator it(*target_path, false,
+                          base::FileEnumerator::DIRECTORIES);
+  std::unique_ptr<WorkItemList> list(WorkItem::CreateWorkItemList());
+  for (base::FilePath name = it.Next(); !name.empty(); name = it.Next()) {
+    list->AddDeleteTreeWorkItem(name, temp_path);
+  }
+
+  return list->Do();
+}
+
 }  // namespace
 
 // Returns a leaky singleton of the App instance.
@@ -279,7 +337,14 @@
       SignalShutdownEvent(updater_scope()));
   StopGoogleUpdateProcesses(updater_scope());
 
-  return list->Do();
+  const bool succeeded = list->Do();
+  if (succeeded) {
+    LOG_IF(ERROR, UninstallGoogleUpdate(
+                      updater_scope(), updater_path, temp_dir->GetPath(),
+                      UpdaterScopeToHKeyRoot(updater_scope())));
+  }
+
+  return succeeded;
 }
 
 bool ComServerApp::MigrateLegacyUpdaters(
diff --git a/chrome/updater/branding.gni b/chrome/updater/branding.gni
index 9132ea0..a75a30f 100644
--- a/chrome/updater/branding.gni
+++ b/chrome/updater/branding.gni
@@ -25,6 +25,7 @@
   updater_product_full_name = "GoogleUpdater"
   mac_team_identifier = "EQHXZ8M8AV"
   legacy_google_update_appid = "{430FD4D0-B729-4F61-AA34-91526481799D}"
+  legacy_service_name_prefix = "gupdate"
   prefs_access_mutex = "{D8E4A6FE-EA7A-4D20-A8C8-B4628776A101}"
   grdfile_name = "google_chrome_strings"
   extra_args_is_chrome_branded = "IS_CHROME_BRANDED=True"
@@ -70,6 +71,7 @@
   updater_product_full_name = "ChromiumUpdater"
   mac_team_identifier = "PLACEHOLDER"
   legacy_google_update_appid = "{8B2B92A3-1BA2-4154-A89C-DA74C9C505E4}"
+  legacy_service_name_prefix = "cupdate"
   prefs_access_mutex = "{A6B9ECD5-772A-4D3F-BFEB-CF9340534A3E}"
   grdfile_name = "chromium_strings"
   extra_args_is_chrome_branded = "IS_CHROME_BRANDED=False"
diff --git a/chrome/updater/test/integration_test_commands.h b/chrome/updater/test/integration_test_commands.h
index 7ac38279..e713010 100644
--- a/chrome/updater/test/integration_test_commands.h
+++ b/chrome/updater/test/integration_test_commands.h
@@ -111,8 +111,8 @@
                                  UpdateService::PolicySameVersionUpdate
                                      policy_same_version_update) const = 0;
 
-  virtual void SetupFakeLegacyUpdaterData() const = 0;
-  virtual void ExpectLegacyUpdaterDataMigrated() const = 0;
+  virtual void SetupFakeLegacyUpdater() const = 0;
+  virtual void ExpectLegacyUpdaterMigrated() const = 0;
   virtual void RunRecoveryComponent(const std::string& app_id,
                                     const base::Version& version) const = 0;
   virtual void ExpectLastChecked() const = 0;
diff --git a/chrome/updater/test/integration_test_commands_system.cc b/chrome/updater/test/integration_test_commands_system.cc
index 704fa5e..db6fb8e2 100644
--- a/chrome/updater/test/integration_test_commands_system.cc
+++ b/chrome/updater/test/integration_test_commands_system.cc
@@ -306,12 +306,12 @@
                           : "false")});
   }
 
-  void SetupFakeLegacyUpdaterData() const override {
-    RunCommand("setup_fake_legacy_updater_data");
+  void SetupFakeLegacyUpdater() const override {
+    RunCommand("setup_fake_legacy_updater");
   }
 
-  void ExpectLegacyUpdaterDataMigrated() const override {
-    RunCommand("expect_legacy_updater_data_migrated");
+  void ExpectLegacyUpdaterMigrated() const override {
+    RunCommand("expect_legacy_updater_migrated");
   }
 
   void RunRecoveryComponent(const std::string& app_id,
diff --git a/chrome/updater/test/integration_test_commands_user.cc b/chrome/updater/test/integration_test_commands_user.cc
index 925e0af3..98d98d2 100644
--- a/chrome/updater/test/integration_test_commands_user.cc
+++ b/chrome/updater/test/integration_test_commands_user.cc
@@ -267,12 +267,12 @@
             UpdateService::PolicySameVersionUpdate::kAllowed);
   }
 
-  void SetupFakeLegacyUpdaterData() const override {
-    updater::test::SetupFakeLegacyUpdaterData(updater_scope_);
+  void SetupFakeLegacyUpdater() const override {
+    updater::test::SetupFakeLegacyUpdater(updater_scope_);
   }
 
-  void ExpectLegacyUpdaterDataMigrated() const override {
-    updater::test::ExpectLegacyUpdaterDataMigrated(updater_scope_);
+  void ExpectLegacyUpdaterMigrated() const override {
+    updater::test::ExpectLegacyUpdaterMigrated(updater_scope_);
   }
 
   void RunRecoveryComponent(const std::string& app_id,
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index 35c44a5..0f8e0795 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -346,12 +346,10 @@
                                       policy_same_version_update);
   }
 
-  void SetupFakeLegacyUpdaterData() {
-    test_commands_->SetupFakeLegacyUpdaterData();
-  }
+  void SetupFakeLegacyUpdater() { test_commands_->SetupFakeLegacyUpdater(); }
 
-  void ExpectLegacyUpdaterDataMigrated() {
-    test_commands_->ExpectLegacyUpdaterDataMigrated();
+  void ExpectLegacyUpdaterMigrated() {
+    test_commands_->ExpectLegacyUpdaterMigrated();
   }
 
   void RunRecoveryComponent(const std::string& app_id,
@@ -982,11 +980,11 @@
 }
 
 TEST_F(IntegrationTest, MigrateLegacyUpdater) {
-  ASSERT_NO_FATAL_FAILURE(SetupFakeLegacyUpdaterData());
+  ASSERT_NO_FATAL_FAILURE(SetupFakeLegacyUpdater());
   ASSERT_NO_FATAL_FAILURE(Install());
   ASSERT_TRUE(WaitForUpdaterExit());
   ASSERT_NO_FATAL_FAILURE(ExpectInstalled());
-  ASSERT_NO_FATAL_FAILURE(ExpectLegacyUpdaterDataMigrated());
+  ASSERT_NO_FATAL_FAILURE(ExpectLegacyUpdaterMigrated());
   ASSERT_NO_FATAL_FAILURE(Uninstall());
 }
 
diff --git a/chrome/updater/test/integration_tests_helper.cc b/chrome/updater/test/integration_tests_helper.cc
index 4e5fcdbe..23ca673a 100644
--- a/chrome/updater/test/integration_tests_helper.cc
+++ b/chrome/updater/test/integration_tests_helper.cc
@@ -316,10 +316,10 @@
                 WithSwitch("install_data_index",
                            WithSwitch("app_id", WithSystemScope(Wrap(
                                                     &CallServiceUpdate)))))},
-    {"setup_fake_legacy_updater_data",
-     WithSystemScope(Wrap(&SetupFakeLegacyUpdaterData))},
-    {"expect_legacy_updater_data_migrated",
-     WithSystemScope(Wrap(&ExpectLegacyUpdaterDataMigrated))},
+    {"setup_fake_legacy_updater",
+     WithSystemScope(Wrap(&SetupFakeLegacyUpdater))},
+    {"expect_legacy_updater_migrated",
+     WithSystemScope(Wrap(&ExpectLegacyUpdaterMigrated))},
     {"run_recovery_component",
      WithSwitch("version", WithSwitch("app_id", WithSystemScope(Wrap(
                                                     &RunRecoveryComponent))))},
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h
index da7aca2..fd7888a 100644
--- a/chrome/updater/test/integration_tests_impl.h
+++ b/chrome/updater/test/integration_tests_impl.h
@@ -237,8 +237,8 @@
                        const std::string& install_data_index,
                        bool same_version_update_allowed);
 
-void SetupFakeLegacyUpdaterData(UpdaterScope scope);
-void ExpectLegacyUpdaterDataMigrated(UpdaterScope scope);
+void SetupFakeLegacyUpdater(UpdaterScope scope);
+void ExpectLegacyUpdaterMigrated(UpdaterScope scope);
 
 void RunRecoveryComponent(UpdaterScope scope,
                           const std::string& app_id,
diff --git a/chrome/updater/test/integration_tests_linux.cc b/chrome/updater/test/integration_tests_linux.cc
index 3658eb6..42f2870a 100644
--- a/chrome/updater/test/integration_tests_linux.cc
+++ b/chrome/updater/test/integration_tests_linux.cc
@@ -175,11 +175,11 @@
   NOTIMPLEMENTED();
 }
 
-void SetupFakeLegacyUpdaterData(UpdaterScope scope) {
+void SetupFakeLegacyUpdater(UpdaterScope scope) {
   // No legacy migration for Linux.
 }
 
-void ExpectLegacyUpdaterDataMigrated(UpdaterScope scope) {
+void ExpectLegacyUpdaterMigrated(UpdaterScope scope) {
   // No legacy migration for Linux.
 }
 
diff --git a/chrome/updater/test/integration_tests_mac.mm b/chrome/updater/test/integration_tests_mac.mm
index 482a6d7..42328e6 100644
--- a/chrome/updater/test/integration_tests_mac.mm
+++ b/chrome/updater/test/integration_tests_mac.mm
@@ -302,7 +302,7 @@
   ASSERT_EQ(exit_code, 0);
 }
 
-void SetupFakeLegacyUpdaterData(UpdaterScope scope) {
+void SetupFakeLegacyUpdater(UpdaterScope scope) {
   base::FilePath test_ticket_store_path;
   ASSERT_TRUE(
       base::PathService::Get(chrome::DIR_TEST_DATA, &test_ticket_store_path));
@@ -318,7 +318,7 @@
                                  FILE_PATH_LITERAL("Keystone.ticketstore"))));
 }
 
-void ExpectLegacyUpdaterDataMigrated(UpdaterScope scope) {
+void ExpectLegacyUpdaterMigrated(UpdaterScope scope) {
   scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope);
   auto persisted_data = base::MakeRefCounted<PersistedData>(
       scope, global_prefs->GetPrefService());
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc
index e180905..a7ec3ab 100644
--- a/chrome/updater/test/integration_tests_win.cc
+++ b/chrome/updater/test/integration_tests_win.cc
@@ -1436,7 +1436,7 @@
   ASSERT_EQ(exit_code, 0);
 }
 
-void SetupFakeLegacyUpdaterData(UpdaterScope scope) {
+void SetupFakeLegacyUpdater(UpdaterScope scope) {
   const HKEY root = UpdaterScopeToHKeyRoot(scope);
 
   base::win::RegKey key;
@@ -1468,9 +1468,44 @@
   ASSERT_EQ(key.WriteValue(kRegValueBrandCode, L"GGLS"), ERROR_SUCCESS);
   ASSERT_EQ(key.WriteValue(kRegValueAP, L"TestAP"), ERROR_SUCCESS);
   key.Close();
+
+  if (IsSystemInstall(scope)) {
+    // Install mock GoogleUpdate services "gupdate" and "gupdatem".
+    EXPECT_TRUE(CreateService(kLegacyServiceNamePrefix,
+                              kLegacyServiceDisplayNamePrefix,
+                              L"C:\\temp\\temp.exe"));
+    EXPECT_TRUE(CreateService(base::StrCat({kLegacyServiceNamePrefix, L"m"}),
+                              kLegacyServiceDisplayNamePrefix,
+                              L"C:\\temp\\temp.exe"));
+  } else {
+    // Install mock GoogleUpdate run value.
+    base::win::RegKey run_key;
+    ASSERT_EQ(
+        run_key.Open(HKEY_CURRENT_USER, REGSTR_PATH_RUN, KEY_READ | KEY_WRITE),
+        ERROR_SUCCESS);
+    ASSERT_EQ(run_key.WriteValue(kLegacyRunValuePrefix, L"C:\\temp\\temp.exe"),
+              ERROR_SUCCESS);
+  }
+
+  // Install mock GoogleUpdate tasks.
+  scoped_refptr<TaskScheduler> task_scheduler =
+      TaskScheduler::CreateInstance(scope, /*use_task_subfolders=*/false);
+  ASSERT_TRUE(task_scheduler);
+
+  const std::wstring task_name_prefix(IsSystemInstall(scope)
+                                          ? kLegacyTaskNamePrefixSystem
+                                          : kLegacyTaskNamePrefixUser);
+  for (const std::wstring& task_name :
+       {base::StrCat({task_name_prefix, L"Core"}),
+        base::StrCat({task_name_prefix, L"UA"})}) {
+    ASSERT_TRUE(task_scheduler->RegisterTask(
+        task_name.c_str(), task_name.c_str(),
+        base::CommandLine::FromString(L"C:\\temp\\temp.exe"),
+        TaskScheduler::TriggerType::TRIGGER_TYPE_HOURLY, false));
+  }
 }
 
-void ExpectLegacyUpdaterDataMigrated(UpdaterScope scope) {
+void ExpectLegacyUpdaterMigrated(UpdaterScope scope) {
   scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope);
   auto persisted_data = base::MakeRefCounted<PersistedData>(
       scope, global_prefs->GetPrefService());
@@ -1496,6 +1531,42 @@
   EXPECT_EQ(persisted_data->GetAP(kChromeAppId), "TestAP");
   EXPECT_EQ(persisted_data->GetBrandCode(kChromeAppId), "GGLS");
   EXPECT_TRUE(persisted_data->GetFingerprint(kChromeAppId).empty());
+
+  int count_entries = 0;
+  if (IsSystemInstall(scope)) {
+    // Expect no GoogleUpdate services.
+    ForEachServiceWithPrefix(
+        kLegacyServiceNamePrefix, kLegacyServiceDisplayNamePrefix,
+        base::BindLambdaForTesting(
+            [&count_entries](const std::wstring& /*service_name*/) {
+              ++count_entries;
+            }));
+  } else {
+    // Expect no GoogleUpdate run value.
+    ForEachRegistryRunValueWithPrefix(
+        kLegacyRunValuePrefix,
+        base::BindLambdaForTesting(
+            [&count_entries](const std::wstring& /* run_name*/) {
+              ++count_entries;
+            }));
+  }
+  EXPECT_EQ(count_entries, 0);
+
+  // Expect no GoogleUpdate tasks.
+  count_entries = 0;
+  const std::wstring task_name_prefix(IsSystemInstall(scope)
+                                          ? kLegacyTaskNamePrefixSystem
+                                          : kLegacyTaskNamePrefixUser);
+  scoped_refptr<TaskScheduler> task_scheduler =
+      TaskScheduler::CreateInstance(scope, /*use_task_subfolders=*/false);
+  task_scheduler->ForEachTaskWithPrefix(
+      task_name_prefix,
+      base::BindLambdaForTesting(
+          [&count_entries](const std::wstring& /*task_name*/) {
+            ++count_entries;
+          }));
+
+  EXPECT_EQ(count_entries, 0);
 }
 
 void InstallApp(UpdaterScope scope, const std::string& app_id) {
diff --git a/chrome/updater/tools/main.cc b/chrome/updater/tools/main.cc
index d83dbcb..24805c91 100644
--- a/chrome/updater/tools/main.cc
+++ b/chrome/updater/tools/main.cc
@@ -176,9 +176,7 @@
       std::cerr << "Error while setting superfluous certificate tag.";
       std::exit(1);
     }
-    if (base::WriteFile(out_filename,
-                        reinterpret_cast<const char*>(new_contents->data()),
-                        new_contents->size()) == -1) {
+    if (!base::WriteFile(out_filename, *new_contents)) {
       std::cerr << "Error while writing updated file "
                 << logging::GetLastSystemErrorCode();
       std::exit(1);
diff --git a/chrome/updater/updater_branding.h.in b/chrome/updater/updater_branding.h.in
index 8b24e50..3ff5afdd 100644
--- a/chrome/updater/updater_branding.h.in
+++ b/chrome/updater/updater_branding.h.in
@@ -20,4 +20,5 @@
 #define UPDATE_CHECK_URL "@UPDATE_CHECK_URL@"
 #define MAC_TEAM_IDENTIFIER_STRING "@MAC_TEAM_IDENTIFIER@"
 #define LEGACY_GOOGLE_UPDATE_APPID "@LEGACY_GOOGLE_UPDATE_APPID@"
+#define LEGACY_SERVICE_NAME_PREFIX "@LEGACY_SERVICE_NAME_PREFIX@"
 #define PREFS_ACCESS_MUTEX "@PREFS_ACCESS_MUTEX@"
diff --git a/chrome/updater/util/unittest_util_win.cc b/chrome/updater/util/unittest_util_win.cc
index cef4786..f6b9ad2 100644
--- a/chrome/updater/util/unittest_util_win.cc
+++ b/chrome/updater/util/unittest_util_win.cc
@@ -113,4 +113,21 @@
   cmd_exe_command_line = base::CommandLine(cmd_exe_path);
 }
 
+[[nodiscard]] bool CreateService(const std::wstring& service_name,
+                                 const std::wstring& display_name,
+                                 const std::wstring& command_line) {
+  ScopedScHandle scm(::OpenSCManager(
+      nullptr, nullptr, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE));
+  if (!scm.IsValid()) {
+    return false;
+  }
+
+  ScopedScHandle service(::CreateService(
+      scm.Get(), service_name.c_str(), display_name.c_str(),
+      DELETE | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG,
+      SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+      command_line.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr));
+  return service.IsValid() || ::GetLastError() == ERROR_SERVICE_EXISTS;
+}
+
 }  // namespace updater
diff --git a/chrome/updater/util/unittest_util_win.h b/chrome/updater/util/unittest_util_win.h
index e74e39f..25a756a 100644
--- a/chrome/updater/util/unittest_util_win.h
+++ b/chrome/updater/util/unittest_util_win.h
@@ -57,6 +57,11 @@
                  base::CommandLine& cmd_exe_command_line,
                  base::ScopedTempDir& temp_parent_dir);
 
+// Creates a service for test purposes.
+[[nodiscard]] bool CreateService(const std::wstring& service_name,
+                                 const std::wstring& display_name,
+                                 const std::wstring& command_line);
+
 }  // namespace updater
 
 #endif  // CHROME_UPDATER_UTIL_UNITTEST_UTIL_WIN_H_
diff --git a/chrome/updater/util/win_util_unittest.cc b/chrome/updater/util/win_util_unittest.cc
index 66a00438..c6c8b38 100644
--- a/chrome/updater/util/win_util_unittest.cc
+++ b/chrome/updater/util/win_util_unittest.cc
@@ -59,29 +59,6 @@
   return sd;
 }
 
-[[nodiscard]] bool CreateService(const std::wstring& service_name,
-                                 const std::wstring& display_name,
-                                 const std::wstring& command_line) {
-  SC_HANDLE scm = ::OpenSCManager(
-      nullptr, nullptr, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE);
-  if (!scm) {
-    return false;
-  }
-
-  SC_HANDLE service = ::CreateService(
-      scm, service_name.c_str(), display_name.c_str(),
-      DELETE | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG,
-      SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
-      command_line.c_str(), nullptr, nullptr, nullptr, nullptr, nullptr);
-  if (!service && ::GetLastError() != ERROR_SERVICE_EXISTS) {
-    return false;
-  }
-
-  ::CloseServiceHandle(service);
-  ::CloseServiceHandle(scm);
-  return true;
-}
-
 }  // namespace
 
 TEST(WinUtil, GetDownloadProgress) {
diff --git a/chrome/updater/win/manifest_util_unittest.cc b/chrome/updater/win/manifest_util_unittest.cc
index 79848231..15ce48ef 100644
--- a/chrome/updater/win/manifest_util_unittest.cc
+++ b/chrome/updater/win/manifest_util_unittest.cc
@@ -47,10 +47,7 @@
   const std::string dummy_file_contents("Test Executable Contents");
   const base::FilePath expected_installer_path(
       offline_app_dir.Append(executable_name));
-  ASSERT_EQ(
-      base::WriteFile(expected_installer_path, dummy_file_contents.c_str(),
-                      dummy_file_contents.length()),
-      static_cast<int>(dummy_file_contents.length()));
+  ASSERT_TRUE(base::WriteFile(expected_installer_path, dummy_file_contents));
 
   update_client::ProtocolParser::Results results;
   base::FilePath installer_path;
diff --git a/chrome/updater/win/win_constants.cc b/chrome/updater/win/win_constants.cc
index 548d8519..d0c778f 100644
--- a/chrome/updater/win/win_constants.cc
+++ b/chrome/updater/win/win_constants.cc
@@ -51,4 +51,16 @@
 
 const wchar_t kLegacyExeName[] = COMPANY_SHORTNAME_STRING L"Update.exe";
 
+const wchar_t kLegacyServiceNamePrefix[] = L"" LEGACY_SERVICE_NAME_PREFIX;
+
+const wchar_t kLegacyServiceDisplayNamePrefix[] =
+    COMPANY_SHORTNAME_STRING L" Update Service";
+
+const wchar_t kLegacyRunValuePrefix[] = COMPANY_SHORTNAME_STRING L" Update";
+
+const wchar_t kLegacyTaskNamePrefixSystem[] =
+    COMPANY_SHORTNAME_STRING L"UpdateTaskMachine";
+const wchar_t kLegacyTaskNamePrefixUser[] =
+    COMPANY_SHORTNAME_STRING L"UpdateTaskUser";
+
 }  // namespace updater
diff --git a/chrome/updater/win/win_constants.h b/chrome/updater/win/win_constants.h
index 743a94a8..a9812cf 100644
--- a/chrome/updater/win/win_constants.h
+++ b/chrome/updater/win/win_constants.h
@@ -99,6 +99,23 @@
 inline constexpr base::TimeDelta kCreateUpdaterInstanceDelay =
     base::Milliseconds(200);
 
+// `kLegacyServiceNamePrefix` is the common prefix for the legacy GoogleUpdate
+// service names.
+extern const wchar_t kLegacyServiceNamePrefix[];
+
+// "Google Update Service" is the common prefix for the legacy GoogleUpdate
+// service display names.
+extern const wchar_t kLegacyServiceDisplayNamePrefix[];
+
+// "Google Update" is the prefix for the legacy GoogleUpdate "Run" key value
+// under HKCU.
+extern const wchar_t kLegacyRunValuePrefix[];
+
+// "GoogleUpdateTask{Machine/User}" is the common prefix for the legacy
+// GoogleUpdate tasks for system and user respectively.
+extern const wchar_t kLegacyTaskNamePrefixSystem[];
+extern const wchar_t kLegacyTaskNamePrefixUser[];
+
 }  // namespace updater
 
 #endif  // CHROME_UPDATER_WIN_WIN_CONSTANTS_H_
diff --git a/chrome/utility/image_writer/image_writer_unittest.cc b/chrome/utility/image_writer/image_writer_unittest.cc
index e4df692..2732d66 100644
--- a/chrome/utility/image_writer/image_writer_unittest.cc
+++ b/chrome/utility/image_writer/image_writer_unittest.cc
@@ -6,6 +6,7 @@
 #include <string.h>
 
 #include <string>
+#include <vector>
 
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -28,7 +29,7 @@
 namespace {
 
 const int64_t kTestFileSize = 1 << 15;  // 32 kB
-const int kTestPattern = 0x55555555;
+const uint8_t kTestPattern = 0x55;
 
 class ImageWriterUtilityTest : public testing::Test {
  protected:
@@ -42,12 +43,9 @@
 
   void TearDown() override {}
 
-  void FillFile(const base::FilePath& path, int pattern) {
-    std::unique_ptr<char[]> buffer(new char[kTestFileSize]);
-    memset(buffer.get(), pattern, kTestFileSize);
-
-    ASSERT_EQ(static_cast<int>(kTestFileSize),
-              base::WriteFile(path, buffer.get(), kTestFileSize));
+  void FillFile(const base::FilePath& path, uint8_t pattern) {
+    std::vector<uint8_t> buffer(kTestFileSize, pattern);
+    ASSERT_TRUE(base::WriteFile(path, buffer));
   }
 
   void FillDefault(const base::FilePath& path) { FillFile(path, kTestPattern); }
diff --git a/chrome/utility/importer/edge_database_reader_unittest_win.cc b/chrome/utility/importer/edge_database_reader_unittest_win.cc
index f741472..2c72e67 100644
--- a/chrome/utility/importer/edge_database_reader_unittest_win.cc
+++ b/chrome/utility/importer/edge_database_reader_unittest_win.cc
@@ -41,8 +41,7 @@
                  const std::string& contents,
                  base::FilePath* output_path) {
     *output_path = temp_dir_.GetPath().Append(name);
-    return base::WriteFile(*output_path, contents.c_str(), contents.size()) >=
-           0;
+    return base::WriteFile(*output_path, contents);
   }
 
   void SetUp() override {
@@ -59,8 +58,7 @@
       return false;
     if (!compression::GzipUncompress(gzip_data, &gzip_data))
       return false;
-    return base::WriteFile(output_file, gzip_data.c_str(), gzip_data.size()) >=
-           0;
+    return base::WriteFile(output_file, gzip_data);
   }
 
   base::ScopedTempDir temp_dir_;
diff --git a/chromecast/browser/migration/migration_utils_test.cc b/chromecast/browser/migration/migration_utils_test.cc
index 2546f5c..b803accb 100644
--- a/chromecast/browser/migration/migration_utils_test.cc
+++ b/chromecast/browser/migration/migration_utils_test.cc
@@ -35,10 +35,9 @@
   base::FilePath new_large_config_path =
       new_config_path.AddExtension(kLargeConfigExtension);
 
-  base::WriteFile(old_config_path, kTestConfigString,
-                  sizeof(kTestConfigString) - 1);
+  base::WriteFile(old_config_path, kTestConfigString);
   base::WriteFile(old_config_path.AddExtension(kLargeConfigExtension),
-                  kTestLargeConfigString, sizeof(kTestLargeConfigString) - 1);
+                  kTestLargeConfigString);
 
   base::ScopedPathOverride eureka_config_override(
       FILE_CAST_CONFIG, old_config_path, /*is_absolute=*/true,
diff --git a/chromecast/tracing/ftrace.cc b/chromecast/tracing/ftrace.cc
index 811629d..6e33ef1 100644
--- a/chromecast/tracing/ftrace.cc
+++ b/chromecast/tracing/ftrace.cc
@@ -102,7 +102,7 @@
                       base::StringPiece contents) {
   base::FilePath path = base::FilePath(tracing_dir).Append(trace_file);
 
-  if (!base::WriteFile(path, contents.data(), contents.size())) {
+  if (!base::WriteFile(path, contents)) {
     PLOG(ERROR) << "write: " << path;
     return false;
   }
diff --git a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc b/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc
index 062741f7..4329ae4 100644
--- a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc
+++ b/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc
@@ -101,20 +101,53 @@
   system::FakeStatisticsProvider statistics_provider_;
 };
 
-TEST_F(ChurnCohortUseCaseImplTest, ValidateWindowIdFormattedCorrectly) {
-  // Create fixed timestamp used to generate a fixed window identifier.
-  base::Time new_daily_ts;
-  EXPECT_TRUE(
-      base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_daily_ts));
+class ChurnCohortUseCaseImplEmptyFirstActiveTest : public testing::Test {
+ public:
+  ChurnCohortUseCaseImplEmptyFirstActiveTest() = default;
+  ChurnCohortUseCaseImplEmptyFirstActiveTest(
+      const ChurnCohortUseCaseImplEmptyFirstActiveTest&) = delete;
+  ChurnCohortUseCaseImplEmptyFirstActiveTest& operator=(
+      const ChurnCohortUseCaseImplEmptyFirstActiveTest&) = delete;
+  ~ChurnCohortUseCaseImplEmptyFirstActiveTest() override = default;
 
-  std::string window_id =
-      churn_cohort_use_case_impl_->GenerateWindowIdentifier(new_daily_ts);
+ protected:
+  // testing::Test:
+  void SetUp() override {
+    DeviceActivityController::RegisterPrefs(local_state_.registry());
 
-  EXPECT_EQ(static_cast<int>(window_id.size()), 6);
-  EXPECT_EQ(window_id, "202201");
-}
+    system::StatisticsProvider::SetTestProvider(&statistics_provider_);
 
-TEST_F(ChurnCohortUseCaseImplTest, ValidateChurnMetadata) {
+    // Initialize the churn active status to a default value of 0.
+    churn_active_status_ = std::make_unique<ChurnActiveStatus>(0);
+
+    const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids;
+    churn_cohort_use_case_impl_ = std::make_unique<ChurnCohortUseCaseImpl>(
+        churn_active_status_.get(), kFakePsmDeviceActiveSecret,
+        kFakeChromeParameters, &local_state_,
+        // |FakePsmDelegate| can use any test case parameters.
+        std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */,
+                                          std::string() /* seed */,
+                                          std::move(plaintext_ids)));
+  }
+
+  void TearDown() override {
+    DCHECK(churn_cohort_use_case_impl_);
+    DCHECK(churn_active_status_);
+
+    // Safely destruct unique pointers.
+    churn_cohort_use_case_impl_.reset();
+    churn_active_status_.reset();
+  }
+
+  std::unique_ptr<ChurnActiveStatus> churn_active_status_;
+  std::unique_ptr<ChurnCohortUseCaseImpl> churn_cohort_use_case_impl_;
+
+  // Fake pref service for unit testing the local state.
+  TestingPrefServiceSimple local_state_;
+  system::FakeStatisticsProvider statistics_provider_;
+};
+
+TEST_F(ChurnCohortUseCaseImplTest, ValidateChurnMetadataWithFirstActiveIsTrue) {
   churn_active_status_->InitializeValue(kFakeChurnActiveStatus);
   base::Time new_daily_ts;
   EXPECT_TRUE(
@@ -142,7 +175,7 @@
   EXPECT_EQ(exploded.month, 12);
 }
 
-TEST_F(ChurnCohortUseCaseImplTest, ValidateFirstActiveStatus) {
+TEST_F(ChurnCohortUseCaseImplTest, ValidateFirstActiveStatusIsFalse) {
   base::Time new_daily_ts;
   EXPECT_TRUE(
       base::Time::FromString("01 Nov 2022 23:59:59 GMT", &new_daily_ts));
@@ -155,4 +188,23 @@
   EXPECT_FALSE(
       req.import_data(0).churn_cohort_metadata().is_first_active_in_cohort());
 }
+
+TEST_F(ChurnCohortUseCaseImplEmptyFirstActiveTest,
+       ValidateFirstActiveStatusWithVPDNullField) {
+  base::Time new_daily_ts;
+  EXPECT_TRUE(
+      base::Time::FromString("01 Dec 2022 23:59:59 GMT", &new_daily_ts));
+  churn_cohort_use_case_impl_->SetWindowIdentifier(new_daily_ts);
+  std::string window_id_str =
+      churn_cohort_use_case_impl_->GetWindowIdentifier().value();
+  EXPECT_EQ(window_id_str, "202212");
+  FresnelImportDataRequest req =
+      churn_cohort_use_case_impl_->GenerateImportRequestBody().value();
+  EXPECT_FALSE(req.import_data(0)
+                   .churn_cohort_metadata()
+                   .has_is_first_active_in_cohort());
+
+  // First active week should be null.
+  EXPECT_TRUE(churn_active_status_->GetFirstActiveWeek() == base::Time());
+}
 }  // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc b/chromeos/ash/components/device_activity/device_activity_client_unittest.cc
index 6abd51f..ec6415a3 100644
--- a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc
+++ b/chromeos/ash/components/device_activity/device_activity_client_unittest.cc
@@ -1739,10 +1739,8 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_FALSE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
-    }
-
-    else if (use_case->GetPsmUseCase() ==
-             psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
+    } else if (use_case->GetPsmUseCase() ==
+               psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
       // Before observation import request.
       EXPECT_FALSE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
@@ -1761,9 +1759,7 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_TRUE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
-    }
-
-    else {
+    } else {
       // Successfully import for all remaining use cases.
       SimulateImportResponse(std::string(), net::HTTP_OK);
       task_environment_.RunUntilIdle();
@@ -1836,10 +1832,8 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_TRUE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
-    }
-
-    else if (use_case->GetPsmUseCase() ==
-             psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
+    } else if (use_case->GetPsmUseCase() ==
+               psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
       // Before observation import request.
       EXPECT_FALSE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
@@ -1858,9 +1852,7 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_TRUE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
-    }
-
-    else {
+    } else {
       // Successfully import for all remaining use cases.
       SimulateImportResponse(std::string(), net::HTTP_OK);
       task_environment_.RunUntilIdle();
@@ -1933,10 +1925,8 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_TRUE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
-    }
-
-    else if (use_case->GetPsmUseCase() ==
-             psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
+    } else if (use_case->GetPsmUseCase() ==
+               psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
       // Before observation import request.
       EXPECT_FALSE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
@@ -1955,9 +1945,191 @@
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
       EXPECT_TRUE(GetLocalState()->GetBoolean(
           prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+    } else {
+      // Successfully import for all remaining use cases.
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
     }
 
-    else {
+    EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts);
+  }
+
+  // Check the new churn active status after ping.
+  int updated_active_status_value = churn_active_status_->GetValueAsInt();
+  EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus);
+}
+
+TEST_F(DeviceActivityClientTest,
+       ObservationPeriodGeneratedAfterNewCohortMonth) {
+  int kFakeBeforeChurnActiveStatus = 72089613;
+  int kFakeAfterChurnActiveStatus = 72351771;
+
+  // Set the past ping month to 2022-12.
+  base::Time new_daily_ts = base::Time::Now() - base::Days(10);
+  for (auto* use_case : device_activity_client_->GetUseCases()) {
+    use_case->SetLastKnownPingTimestamp(new_daily_ts);
+  }
+
+  // Set the relative observation local state booleans to all be true.
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true);
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true);
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true);
+
+  // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus.
+  churn_active_status_->InitializeValue(kFakeBeforeChurnActiveStatus);
+
+  // Last Churn Cohort month is: 2022-12, months is 275
+  // Current Churn Cohort month is: 2023-01, months is 276
+  // 275->276:   0100010011->0100010100
+  // 2022-12 active value: 72089613 -> 0100010011 000000000000001101
+  // 2023-01 active value: 72351771 -> 0100010100 000000000000011011
+
+  SetWifiNetworkState(shill::kStateOnline);
+
+  for (auto* use_case : device_activity_client_->GetUseCases()) {
+    SCOPED_TRACE(testing::Message()
+                 << "PSM use case: "
+                 << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase()));
+
+    EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet());
+
+    EXPECT_EQ(device_activity_client_->GetState(),
+              DeviceActivityClient::State::kCheckingIn);
+
+    if (use_case->GetPsmUseCase() ==
+        psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) {
+      // Before cohort import request.
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
+
+      // After cohort import request.
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+    } else if (use_case->GetPsmUseCase() ==
+               psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
+      // Before observation import request.
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_EQ(use_case->GetObservationPeriod(0), "202301-202303");
+      EXPECT_EQ(use_case->GetObservationPeriod(1), std::string());
+      EXPECT_EQ(use_case->GetObservationPeriod(2), std::string());
+
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
+
+      // After observation import request.
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+    } else {
+      // Successfully import for all remaining use cases.
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
+    }
+
+    EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts);
+  }
+
+  // Check the new churn active status after ping.
+  int updated_active_status_value = churn_active_status_->GetValueAsInt();
+  EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus);
+}
+
+TEST_F(DeviceActivityClientTest, ValidateObservationPeriodForUnsetLocalState) {
+  int kFakeBeforeChurnActiveStatus = 72089613;
+  int kFakeAfterChurnActiveStatus = 72351771;
+
+  // Set the past ping month to 2022-12.
+  base::Time new_daily_ts = base::Time::Now() - base::Days(10);
+  for (auto* use_case : device_activity_client_->GetUseCases()) {
+    use_case->SetLastKnownPingTimestamp(new_daily_ts);
+  }
+
+  // Set the relative observation local state booleans.
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, false);
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true);
+  GetLocalState()->SetBoolean(
+      prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, false);
+
+  // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus.
+  churn_active_status_->InitializeValue(kFakeBeforeChurnActiveStatus);
+
+  // Last Churn Cohort month is: 2022-12, months is 275
+  // Current Churn Cohort month is: 2023-01, months is 276
+  // 275->276:   0100010011->0100010100
+  // 2022-12 active value: 72089613 -> 0100010011 000000000000001101
+  // 2023-01 active value: 72351771 -> 0100010100 000000000000011011
+
+  SetWifiNetworkState(shill::kStateOnline);
+
+  for (auto* use_case : device_activity_client_->GetUseCases()) {
+    SCOPED_TRACE(testing::Message()
+                 << "PSM use case: "
+                 << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase()));
+
+    if (use_case->GetPsmUseCase() ==
+        psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) {
+      // Before cohort import request.
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
+
+      // After cohort import request.
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+    } else if (use_case->GetPsmUseCase() ==
+               psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) {
+      // Before observation import request.
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_FALSE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+      EXPECT_EQ(use_case->GetObservationPeriod(0), "202301-202303");
+      EXPECT_EQ(use_case->GetObservationPeriod(1), "202212-202302");
+      EXPECT_EQ(use_case->GetObservationPeriod(2), std::string());
+
+      SimulateImportResponse(std::string(), net::HTTP_OK);
+      task_environment_.RunUntilIdle();
+
+      // After observation import request.
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1));
+      EXPECT_TRUE(GetLocalState()->GetBoolean(
+          prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2));
+    } else {
       // Successfully import for all remaining use cases.
       SimulateImportResponse(std::string(), net::HTTP_OK);
       task_environment_.RunUntilIdle();
diff --git a/chromeos/ash/components/network/BUILD.gn b/chromeos/ash/components/network/BUILD.gn
index 15b9077..3c5ae2bfb 100644
--- a/chromeos/ash/components/network/BUILD.gn
+++ b/chromeos/ash/components/network/BUILD.gn
@@ -22,6 +22,7 @@
     "//chromeos/ash/components/network/metrics",
     "//chromeos/ash/components/network/onc",
     "//chromeos/ash/components/network/proxy",
+    "//chromeos/ash/services/hotspot_config/public/cpp",
     "//chromeos/ash/services/hotspot_config/public/mojom",
     "//chromeos/components/onc",
     "//chromeos/dbus/common",
diff --git a/chromeos/ash/components/network/cellular_esim_installer.h b/chromeos/ash/components/network/cellular_esim_installer.h
index 20ce3659..2b3c062 100644
--- a/chromeos/ash/components/network/cellular_esim_installer.h
+++ b/chromeos/ash/components/network/cellular_esim_installer.h
@@ -25,14 +25,14 @@
 class NetworkProfileHandler;
 class NetworkStateHandler;
 
-// Handles installation of an eSIM profile and it's corresponding network.
+// Handles installation of an eSIM profile and its corresponding network.
 //
 // Installing an eSIM profile involves the following operations:
 // 1. Inhibit cellular scans.
 // 2. Install eSIM profile in Hermes with activation code.
 // 3. Create cellular Shill service configuration.
 // 4. Prepare newly installed cellular network for connection (ie. profile
-// enable).
+//    enable).
 // 5. Connect to network with the new profile.
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularESimInstaller {
  public:
diff --git a/chromeos/ash/components/network/cellular_esim_installer_unittest.cc b/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
index a634c20c..15a69c1f 100644
--- a/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
+++ b/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
@@ -68,12 +68,11 @@
 const char kESimProfileDownloadLatencyHistogram[] =
     "Network.Cellular.ESim.ProfileDownload.ActivationCode.Latency";
 
-base::Value GetPolicyShillProperties() {
-  base::Value new_shill_properties(base::Value::Type::DICT);
+base::Value::Dict GetPolicyShillProperties() {
+  base::Value::Dict new_shill_properties;
   std::unique_ptr<NetworkUIData> ui_data =
       NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY);
-  new_shill_properties.SetStringKey(shill::kUIDataProperty,
-                                    ui_data->GetAsJson());
+  new_shill_properties.Set(shill::kUIDataProperty, ui_data->GetAsJson());
   return new_shill_properties;
 }
 
@@ -148,7 +147,7 @@
       const std::string& activation_code,
       const std::string& confirmation_code,
       const dbus::ObjectPath euicc_path,
-      base::Value new_shill_properties,
+      base::Value::Dict new_shill_properties,
       bool wait_for_connect,
       bool fail_connect,
       bool is_initial_install = true,
@@ -161,7 +160,7 @@
     base::RunLoop run_loop;
     cellular_esim_installer_->InstallProfileFromActivationCode(
         activation_code, confirmation_code, euicc_path,
-        std::move(new_shill_properties.GetDict()),
+        std::move(new_shill_properties),
         base::BindLambdaForTesting(
             [&](HermesResponseStatus install_result,
                 absl::optional<dbus::ObjectPath> esim_profile_path,
@@ -204,11 +203,11 @@
   absl::optional<dbus::ObjectPath> ConfigureESimService(
       const dbus::ObjectPath euicc_path,
       const dbus::ObjectPath& profile_path,
-      base::Value& new_shill_properties) {
+      base::Value::Dict& new_shill_properties) {
     absl::optional<dbus::ObjectPath> service_path_out;
     base::RunLoop run_loop;
     cellular_esim_installer_->ConfigureESimService(
-        new_shill_properties.GetDict(), euicc_path, profile_path,
+        new_shill_properties, euicc_path, profile_path,
         base::BindLambdaForTesting(
             [&](absl::optional<dbus::ObjectPath> service_path) {
               service_path_out = service_path;
@@ -323,7 +322,7 @@
   InstallResultTuple result_tuple = InstallProfileFromActivationCode(
       /*activation_code=*/std::string(), /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/false, /*fail_connect=*/false);
   EXPECT_EQ(HermesResponseStatus::kErrorInvalidActivationCode,
             std::get<0>(result_tuple));
@@ -336,11 +335,6 @@
       CellularESimInstaller::InstallESimProfileResult::kHermesInstallFailed);
 
   // Verify that install from policy are handled properly
-  base::Value new_shill_properties(base::Value::Type::DICT);
-  std::unique_ptr<NetworkUIData> ui_data =
-      NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY);
-  new_shill_properties.SetStringKey(shill::kUIDataProperty,
-                                    ui_data->GetAsJson());
   result_tuple = InstallProfileFromActivationCode(
       /*activation_code=*/std::string(), /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
@@ -368,7 +362,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/true, /*fail_connect=*/true);
   CheckInstallSuccess(result_tuple);
   CheckESimInstallHistograms(
@@ -403,7 +397,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/true, /*fail_connect=*/false);
   CheckInstallSuccess(result_tuple);
 
@@ -443,7 +437,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/true, /*fail_connect=*/false,
       /*is_initial_install=*/true, /*is_install_via_qr_code=*/true);
   CheckInstallSuccess(result_tuple);
@@ -467,7 +461,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/true, /*fail_connect=*/false,
       /*is_initial_install=*/true, /*is_install_via_qr_code=*/true,
       /*auto_connected=*/true);
@@ -495,7 +489,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/false, /*fail_connect=*/false);
   CheckInstallSuccess(result_tuple);
 }
@@ -510,7 +504,7 @@
           ->GenerateFakeActivationCode(),
       /*confirmation_code=*/std::string(),
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
-      /*new_shill_properties=*/base::Value(base::Value::Type::DICT),
+      /*new_shill_properties=*/base::Value::Dict(),
       /*wait_for_connect=*/false, /*fail_connect=*/false);
   CheckInstallSuccess(result_tuple);
 }
@@ -523,11 +517,10 @@
           HermesEuiccClient::TestInterface::AddCarrierProfileBehavior::
               kAddProfileWithoutService);
 
-  base::Value new_shill_properties(base::Value::Type::DICT);
+  base::Value::Dict new_shill_properties;
   std::unique_ptr<NetworkUIData> ui_data =
       NetworkUIData::CreateFromONC(::onc::ONCSource::ONC_SOURCE_DEVICE_POLICY);
-  new_shill_properties.SetStringKey(shill::kUIDataProperty,
-                                    ui_data->GetAsJson());
+  new_shill_properties.Set(shill::kUIDataProperty, ui_data->GetAsJson());
   absl::optional<dbus::ObjectPath> service_path = ConfigureESimService(
       dbus::ObjectPath(kTestEuiccPath), profile_path, new_shill_properties);
   EXPECT_TRUE(service_path.has_value());
@@ -559,7 +552,7 @@
   ShillManagerClient::Get()->GetTestInterface()->SetSimulateConfigurationResult(
       FakeShillSimulatedResult::kFailure);
 
-  base::Value new_shill_properties(base::Value::Type::DICT);
+  base::Value::Dict new_shill_properties;
   absl::optional<dbus::ObjectPath> service_path = ConfigureESimService(
       dbus::ObjectPath(kTestEuiccPath), profile_path, new_shill_properties);
   EXPECT_FALSE(service_path.has_value());
diff --git a/chromeos/ash/components/network/cellular_esim_profile.cc b/chromeos/ash/components/network/cellular_esim_profile.cc
index fdc06ac..ebc02796 100644
--- a/chromeos/ash/components/network/cellular_esim_profile.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile.cc
@@ -24,42 +24,46 @@
 
 // static
 absl::optional<CellularESimProfile> CellularESimProfile::FromDictionaryValue(
-    const base::Value& value) {
-  if (!value.is_dict())
+    const base::Value::Dict& value) {
+  const std::string* path = value.FindString(kKeyPath);
+  if (!path) {
     return absl::nullopt;
+  }
 
-  const std::string* path = value.FindStringPath(kKeyPath);
-  if (!path)
+  absl::optional<int> state = value.FindInt(kKeyState);
+  if (!state) {
     return absl::nullopt;
+  }
 
-  absl::optional<int> state = value.FindIntPath(kKeyState);
-  if (!state)
+  const std::string* eid = value.FindString(kKeyEid);
+  if (!eid) {
     return absl::nullopt;
+  }
 
-  const std::string* eid = value.FindStringPath(kKeyEid);
-  if (!eid)
+  const std::string* iccid = value.FindString(kKeyIccid);
+  if (!iccid) {
     return absl::nullopt;
+  }
 
-  const std::string* iccid = value.FindStringPath(kKeyIccid);
-  if (!iccid)
+  const std::string* name = value.FindString(kKeyName);
+  if (!name) {
     return absl::nullopt;
+  }
 
-  const std::string* name = value.FindStringPath(kKeyName);
-  if (!name)
+  const std::string* nickname = value.FindString(kKeyNickname);
+  if (!nickname) {
     return absl::nullopt;
+  }
 
-  const std::string* nickname = value.FindStringPath(kKeyNickname);
-  if (!nickname)
+  const std::string* service_provider = value.FindString(kKeyServiceProvider);
+  if (!service_provider) {
     return absl::nullopt;
+  }
 
-  const std::string* service_provider =
-      value.FindStringPath(kKeyServiceProvider);
-  if (!service_provider)
+  const std::string* activation_code = value.FindString(kKeyActivationCode);
+  if (!activation_code) {
     return absl::nullopt;
-
-  const std::string* activation_code = value.FindStringPath(kKeyActivationCode);
-  if (!activation_code)
-    return absl::nullopt;
+  }
 
   return CellularESimProfile(
       static_cast<State>(*state), dbus::ObjectPath(*path), *eid, *iccid,
@@ -91,16 +95,16 @@
 
 CellularESimProfile::~CellularESimProfile() = default;
 
-base::Value CellularESimProfile::ToDictionaryValue() const {
-  base::Value dictionary(base::Value::Type::DICT);
-  dictionary.SetKey(kKeyState, base::Value(static_cast<int>(state_)));
-  dictionary.SetKey(kKeyPath, base::Value(path_.value()));
-  dictionary.SetKey(kKeyEid, base::Value(eid_));
-  dictionary.SetKey(kKeyIccid, base::Value(iccid_));
-  dictionary.SetKey(kKeyName, base::Value(name_));
-  dictionary.SetKey(kKeyNickname, base::Value(nickname_));
-  dictionary.SetKey(kKeyServiceProvider, base::Value(service_provider_));
-  dictionary.SetKey(kKeyActivationCode, base::Value(activation_code_));
+base::Value::Dict CellularESimProfile::ToDictionaryValue() const {
+  base::Value::Dict dictionary;
+  dictionary.Set(kKeyState, static_cast<int>(state_));
+  dictionary.Set(kKeyPath, path_.value());
+  dictionary.Set(kKeyEid, eid_);
+  dictionary.Set(kKeyIccid, iccid_);
+  dictionary.Set(kKeyName, name_);
+  dictionary.Set(kKeyNickname, nickname_);
+  dictionary.Set(kKeyServiceProvider, service_provider_);
+  dictionary.Set(kKeyActivationCode, activation_code_);
   return dictionary;
 }
 
diff --git a/chromeos/ash/components/network/cellular_esim_profile.h b/chromeos/ash/components/network/cellular_esim_profile.h
index f9f07aad..0d5946f4 100644
--- a/chromeos/ash/components/network/cellular_esim_profile.h
+++ b/chromeos/ash/components/network/cellular_esim_profile.h
@@ -38,7 +38,7 @@
   // properties. Should be provided a dictionary created via
   // ToDictionaryValue().
   static absl::optional<CellularESimProfile> FromDictionaryValue(
-      const base::Value& value);
+      const base::Value::Dict& value);
 
   CellularESimProfile(State state,
                       const dbus::ObjectPath& path,
@@ -61,7 +61,7 @@
   const std::u16string& service_provider() const { return service_provider_; }
   const std::string& activation_code() const { return activation_code_; }
 
-  base::Value ToDictionaryValue() const;
+  base::Value::Dict ToDictionaryValue() const;
 
   bool operator==(const CellularESimProfile& other) const;
   bool operator!=(const CellularESimProfile& other) const;
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
index 2064160..e7082039 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
@@ -73,7 +73,7 @@
     }
 
     absl::optional<CellularESimProfile> profile =
-        CellularESimProfile::FromDictionaryValue(value);
+        CellularESimProfile::FromDictionaryValue(value.GetDict());
     if (!profile) {
       NET_LOG(ERROR) << "Unable to deserialize eSIM profile: " << value;
       continue;
@@ -166,7 +166,7 @@
   // originally boots or after a powerwash.
   for (const auto& path : euicc_paths) {
     NET_LOG(EVENT) << "Found new EUICC whose profiles have not yet been "
-                   << "refreshsed. Refreshing profile list for " << path;
+                   << "refreshed. Refreshing profile list for " << path;
     RefreshProfileListAndRestoreSlot(
         dbus::ObjectPath(path),
         base::BindOnce(
diff --git a/chromeos/ash/components/network/cellular_esim_profile_unittest.cc b/chromeos/ash/components/network/cellular_esim_profile_unittest.cc
index 98254513..47954fd5 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_unittest.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_unittest.cc
@@ -18,7 +18,7 @@
                               "iccid", u"name", u"nickname", u"serviceProvider",
                               "activationCode");
 
-  base::Value dictionary = profile.ToDictionaryValue();
+  base::Value::Dict dictionary = profile.ToDictionaryValue();
   absl::optional<CellularESimProfile> from_dictionary =
       CellularESimProfile::FromDictionaryValue(dictionary);
   EXPECT_TRUE(from_dictionary);
@@ -34,15 +34,9 @@
 }
 
 TEST(CellularESimProfileTest, InvalidDictionary) {
-  // Try to convert a non-dictionary.
-  base::Value non_dictionary(1337);
-  absl::optional<CellularESimProfile> from_non_dictionary =
-      CellularESimProfile::FromDictionaryValue(non_dictionary);
-  EXPECT_FALSE(from_non_dictionary);
-
   // Try to convert a dictionary without the required keys.
-  base::Value dictionary(base::Value::Type::DICT);
-  dictionary.SetPath("sampleKey", base::Value("sampleValue"));
+  base::Value::Dict dictionary;
+  dictionary.Set("sampleKey", "sampleValue");
   absl::optional<CellularESimProfile> from_dictionary =
       CellularESimProfile::FromDictionaryValue(dictionary);
   EXPECT_FALSE(from_dictionary);
diff --git a/chromeos/ash/components/network/client_cert_resolver_unittest.cc b/chromeos/ash/components/network/client_cert_resolver_unittest.cc
index e7651268..7df055a 100644
--- a/chromeos/ash/components/network/client_cert_resolver_unittest.cc
+++ b/chromeos/ash/components/network/client_cert_resolver_unittest.cc
@@ -83,10 +83,10 @@
   std::string pkcs12_base64_encoded;
   base::Base64Encode(pkcs12_raw, &pkcs12_base64_encoded);
 
-  base::Value onc_certificate(base::Value::Type::DICT);
-  onc_certificate.SetKey("GUID", base::Value(guid));
-  onc_certificate.SetKey("Type", base::Value("Client"));
-  onc_certificate.SetKey("PKCS12", base::Value(pkcs12_base64_encoded));
+  base::Value::Dict onc_certificate;
+  onc_certificate.Set("GUID", guid);
+  onc_certificate.Set("Type", "Client");
+  onc_certificate.Set("PKCS12", pkcs12_base64_encoded);
   base::Value::List onc_certificates;
   onc_certificates.Append(std::move(onc_certificate));
   return std::make_unique<chromeos::onc::OncParsedCertificates>(
diff --git a/chromeos/ash/components/network/client_cert_util_unittest.cc b/chromeos/ash/components/network/client_cert_util_unittest.cc
index ec46d19..e01cd2f 100644
--- a/chromeos/ash/components/network/client_cert_util_unittest.cc
+++ b/chromeos/ash/components/network/client_cert_util_unittest.cc
@@ -240,8 +240,7 @@
   base::Value::Dict shill_properties;
   SetShillProperties(ConfigType::kOpenVpn, 2, "abcd1234", shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "OpenVPN.Pkcs11.PIN": "111111",
          "OpenVPN.Pkcs11.ID": "abcd1234"
        })"));
@@ -251,8 +250,7 @@
   base::Value::Dict shill_properties;
   SetShillProperties(ConfigType::kL2tpIpsec, 2, "abcd1234", shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "L2TPIPsec.PIN": "111111",
          "L2TPIPsec.ClientCertID": "abcd1234",
          "L2TPIPsec.ClientCertSlot": "2"
@@ -263,8 +261,7 @@
   base::Value::Dict shill_properties;
   SetShillProperties(ConfigType::kIkev2, 2, "abcd1234", shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "IKEv2.ClientCertID": "abcd1234",
          "IKEv2.ClientCertSlot": "2"
        })"));
@@ -274,8 +271,7 @@
   base::Value::Dict shill_properties;
   SetShillProperties(ConfigType::kEap, 2, "abcd1234", shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "EAP.PIN": "111111",
          "EAP.CertID": "2:abcd1234",
          "EAP.KeyID": "2:abcd1234"
@@ -286,8 +282,7 @@
   base::Value::Dict shill_properties;
   SetEmptyShillProperties(ConfigType::kOpenVpn, shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "OpenVPN.Pkcs11.PIN": "",
          "OpenVPN.Pkcs11.ID": ""
        })"));
@@ -297,8 +292,7 @@
   base::Value::Dict shill_properties;
   SetEmptyShillProperties(ConfigType::kL2tpIpsec, shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "L2TPIPsec.PIN": "",
          "L2TPIPsec.ClientCertID": "",
          "L2TPIPsec.ClientCertSlot": ""
@@ -309,8 +303,7 @@
   base::Value::Dict shill_properties;
   SetEmptyShillProperties(ConfigType::kIkev2, shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "IKEv2.ClientCertID": "",
          "IKEv2.ClientCertSlot": ""
        })"));
@@ -320,8 +313,7 @@
   base::Value::Dict shill_properties;
   SetEmptyShillProperties(ConfigType::kEap, shill_properties);
 
-  EXPECT_THAT(base::Value(std::move(shill_properties)), base::test::IsJson(
-                                                            R"({
+  EXPECT_THAT(shill_properties, base::test::IsJson(R"({
          "EAP.PIN": "",
          "EAP.CertID": "",
          "EAP.KeyID": ""
diff --git a/chromeos/ash/components/network/geolocation_handler.cc b/chromeos/ash/components/network/geolocation_handler.cc
index 2f0ef22..d7407df7 100644
--- a/chromeos/ash/components/network/geolocation_handler.cc
+++ b/chromeos/ash/components/network/geolocation_handler.cc
@@ -28,16 +28,15 @@
   return base::NumberToString(result);
 }
 
-std::string FindStringOrEmpty(const base::Value& dict,
+std::string FindStringOrEmpty(const base::Value::Dict& dict,
                               const base::StringPiece key) {
-  const std::string* val = dict.FindStringKey(key);
+  const std::string* val = dict.FindString(key);
   return val ? *val : std::string();
 }
 
 }  // namespace
 
-GeolocationHandler::GeolocationHandler()
-    : cellular_enabled_(false), wifi_enabled_(false) {}
+GeolocationHandler::GeolocationHandler() = default;
 
 GeolocationHandler::~GeolocationHandler() {
   if (ShillManagerClient::Get())
@@ -181,20 +180,21 @@
         continue;
       }
       if (device_type == shill::kGeoWifiAccessPointsProperty) {
-        AddAccessPointFromDict(entry);
+        AddAccessPointFromDict(entry.GetDict());
       } else if (device_type == shill::kGeoCellTowersProperty) {
-        AddCellTowerFromDict(entry);
+        AddCellTowerFromDict(entry.GetDict());
       }
     }
   }
   geolocation_received_time_ = base::Time::Now();
 }
 
-void GeolocationHandler::AddAccessPointFromDict(const base::Value& entry) {
+void GeolocationHandler::AddAccessPointFromDict(
+    const base::Value::Dict& entry) {
   // Docs: developers.google.com/maps/documentation/business/geolocation
   WifiAccessPoint wap;
 
-  const std::string* age_str = entry.FindStringKey(shill::kGeoAgeProperty);
+  const std::string* age_str = entry.FindString(shill::kGeoAgeProperty);
   if (age_str) {
     int64_t age_ms;
     if (base::StringToInt64(*age_str, &age_ms)) {
@@ -205,19 +205,18 @@
   wap.mac_address = FindStringOrEmpty(entry, shill::kGeoMacAddressProperty);
 
   const std::string* strength_str =
-      entry.FindStringKey(shill::kGeoSignalStrengthProperty);
+      entry.FindString(shill::kGeoSignalStrengthProperty);
   if (strength_str) {
     base::StringToInt(*strength_str, &wap.signal_strength);
   }
 
   const std::string* signal_str =
-      entry.FindStringKey(shill::kGeoSignalToNoiseRatioProperty);
+      entry.FindString(shill::kGeoSignalToNoiseRatioProperty);
   if (signal_str) {
     base::StringToInt(*signal_str, &wap.signal_to_noise);
   }
 
-  const std::string* channel_str =
-      entry.FindStringKey(shill::kGeoChannelProperty);
+  const std::string* channel_str = entry.FindString(shill::kGeoChannelProperty);
   if (channel_str) {
     base::StringToInt(*channel_str, &wap.channel);
   }
@@ -225,14 +224,14 @@
   wifi_access_points_.push_back(wap);
 }
 
-void GeolocationHandler::AddCellTowerFromDict(const base::Value& entry) {
+void GeolocationHandler::AddCellTowerFromDict(const base::Value::Dict& entry) {
   // Docs: developers.google.com/maps/documentation/business/geolocation
 
   // Create object.
   CellTower ct;
 
   // Read time fields into object.
-  const std::string* age_str = entry.FindStringKey(shill::kGeoAgeProperty);
+  const std::string* age_str = entry.FindString(shill::kGeoAgeProperty);
   if (age_str) {
     int64_t age_ms;
     if (base::StringToInt64(*age_str, &age_ms)) {
@@ -241,14 +240,13 @@
   }
 
   // Read hex fields into object.
-  const std::string* hex_cell_id =
-      entry.FindStringKey(shill::kGeoCellIdProperty);
+  const std::string* hex_cell_id = entry.FindString(shill::kGeoCellIdProperty);
   if (hex_cell_id) {
     ct.ci = HexToDecimal(*hex_cell_id);
   }
 
   const std::string* hex_lac =
-      entry.FindStringKey(shill::kGeoLocationAreaCodeProperty);
+      entry.FindString(shill::kGeoLocationAreaCodeProperty);
   if (hex_lac) {
     ct.lac = HexToDecimal(*hex_lac);
   }
diff --git a/chromeos/ash/components/network/geolocation_handler.h b/chromeos/ash/components/network/geolocation_handler.h
index d3c4f12..ec42a91 100644
--- a/chromeos/ash/components/network/geolocation_handler.h
+++ b/chromeos/ash/components/network/geolocation_handler.h
@@ -17,7 +17,7 @@
 
 namespace ash {
 
-// This class provices Shill Wifi Access Point and Cell Tower data. It
+// This class provides Shill Wifi Access Point and Cell Tower data. It
 // currently relies on polling because that is the usage model in
 // content::WifiDataProvider. This class requests data asynchronously,
 // returning the most recent available data. A typical usage pattern,
@@ -80,13 +80,13 @@
   // Callback for receiving Geolocation data.
   void GeolocationCallback(absl::optional<base::Value::Dict> properties);
 
-  bool cellular_enabled_;
-  bool wifi_enabled_;
+  bool cellular_enabled_ = false;
+  bool wifi_enabled_ = false;
 
-  void AddCellTowerFromDict(const base::Value& entry);
-  void AddAccessPointFromDict(const base::Value& entry);
+  void AddCellTowerFromDict(const base::Value::Dict& entry);
+  void AddAccessPointFromDict(const base::Value::Dict& entry);
 
-  // Cached netork information and update time
+  // Cached network information and update time
   WifiAccessPointVector wifi_access_points_;
   CellTowerVector cell_towers_;
   base::Time geolocation_received_time_;
diff --git a/chromeos/ash/components/network/hotspot_controller.cc b/chromeos/ash/components/network/hotspot_controller.cc
index a7f5ea5..32914c10 100644
--- a/chromeos/ash/components/network/hotspot_controller.cc
+++ b/chromeos/ash/components/network/hotspot_controller.cc
@@ -149,6 +149,10 @@
         NetworkTypePattern::WiFi(), /*enabled=*/true,
         network_handler::ErrorCallback());
   }
+  if (result == hotspot_config::mojom::HotspotControlResult::kSuccess &&
+      current_request_->enabled) {
+    NotifyHotspotTurnedOn(current_request_->wifi_turned_off);
+  }
   std::move(current_request_->callback).Run(result);
   current_request_.reset();
 
diff --git a/chromeos/ash/components/network/hotspot_controller.h b/chromeos/ash/components/network/hotspot_controller.h
index 1e965a2..b9712faa3 100644
--- a/chromeos/ash/components/network/hotspot_controller.h
+++ b/chromeos/ash/components/network/hotspot_controller.h
@@ -13,6 +13,7 @@
 #include "chromeos/ash/components/network/hotspot_capabilities_provider.h"
 #include "chromeos/ash/components/network/hotspot_state_handler.h"
 #include "chromeos/ash/components/network/technology_state_controller.h"
+#include "chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.h"
 #include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom-forward.h"
 
 namespace ash {
@@ -27,12 +28,13 @@
 // Enable or disable requests are queued and executes one request at a time in
 // order.
 class COMPONENT_EXPORT(CHROMEOS_NETWORK) HotspotController
-    : public TechnologyStateController::HotspotOperationDelegate {
+    : public TechnologyStateController::HotspotOperationDelegate,
+      public hotspot_config::HotspotEnabledStateProvider {
  public:
   HotspotController();
   HotspotController(const HotspotController&) = delete;
   HotspotController& operator=(const HotspotController&) = delete;
-  virtual ~HotspotController();
+  ~HotspotController() override;
 
   void Init(HotspotCapabilitiesProvider* hotspot_capabilities_provider,
             HotspotStateHandler* hotspot_state_handler,
diff --git a/chromeos/ash/components/network/hotspot_state_handler.cc b/chromeos/ash/components/network/hotspot_state_handler.cc
index a62e4ec..9c9a88a 100644
--- a/chromeos/ash/components/network/hotspot_state_handler.cc
+++ b/chromeos/ash/components/network/hotspot_state_handler.cc
@@ -99,11 +99,12 @@
     return;
   }
 
-  base::Value shill_tethering_config =
+  base::Value::Dict shill_tethering_config =
       MojomConfigToShillConfig(std::move(mojom_config));
   auto callback_split = base::SplitOnceCallback(std::move(callback));
   ShillManagerClient::Get()->SetProperty(
-      shill::kTetheringConfigProperty, std::move(shill_tethering_config),
+      shill::kTetheringConfigProperty,
+      base::Value(std::move(shill_tethering_config)),
       base::BindOnce(&HotspotStateHandler::OnSetHotspotConfigSuccess,
                      weak_ptr_factory_.GetWeakPtr(),
                      std::move(callback_split.first)),
diff --git a/chromeos/ash/components/network/hotspot_util.cc b/chromeos/ash/components/network/hotspot_util.cc
index b8f94dc..81cc7f4 100644
--- a/chromeos/ash/components/network/hotspot_util.cc
+++ b/chromeos/ash/components/network/hotspot_util.cc
@@ -164,24 +164,21 @@
   return result;
 }
 
-base::Value MojomConfigToShillConfig(
+base::Value::Dict MojomConfigToShillConfig(
     const hotspot_config::mojom::HotspotConfigPtr mojom_config) {
   using hotspot_config::mojom::HotspotConfig;
 
-  base::Value result(base::Value::Type::DICT);
-  result.GetDict().Set(shill::kTetheringConfAutoDisableProperty,
-                       base::Value(mojom_config->auto_disable));
-  result.GetDict().Set(shill::kTetheringConfBandProperty,
-                       base::Value(MojomBandToString(mojom_config->band)));
-  result.GetDict().Set(
-      shill::kTetheringConfSecurityProperty,
-      base::Value(MojomSecurityToString(mojom_config->security)));
-  result.GetDict().Set(shill::kTetheringConfSSIDProperty,
-                       base::Value(HexEncode(mojom_config->ssid)));
-  result.GetDict().Set(shill::kTetheringConfPassphraseProperty,
-                       base::Value(mojom_config->passphrase));
-  result.GetDict().Set(shill::kTetheringConfMARProperty,
-                       base::Value(mojom_config->bssid_randomization));
+  base::Value::Dict result;
+  result.Set(shill::kTetheringConfAutoDisableProperty,
+             mojom_config->auto_disable);
+  result.Set(shill::kTetheringConfBandProperty,
+             MojomBandToString(mojom_config->band));
+  result.Set(shill::kTetheringConfSecurityProperty,
+             MojomSecurityToString(mojom_config->security));
+  result.Set(shill::kTetheringConfSSIDProperty, HexEncode(mojom_config->ssid));
+  result.Set(shill::kTetheringConfPassphraseProperty, mojom_config->passphrase);
+  result.Set(shill::kTetheringConfMARProperty,
+             mojom_config->bssid_randomization);
   return result;
 }
 
diff --git a/chromeos/ash/components/network/hotspot_util.h b/chromeos/ash/components/network/hotspot_util.h
index 96b4f54..32f1d72 100644
--- a/chromeos/ash/components/network/hotspot_util.h
+++ b/chromeos/ash/components/network/hotspot_util.h
@@ -29,7 +29,7 @@
 // Convert mojom::HotspotConfigPtr to the corresponding shill tethering config
 // value
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-base::Value MojomConfigToShillConfig(
+base::Value::Dict MojomConfigToShillConfig(
     const hotspot_config::mojom::HotspotConfigPtr mojom_config);
 
 // Convert enable or disable tethering result string from shill to
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
index bf9d5e68..c68f708 100644
--- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
@@ -1143,13 +1143,14 @@
     NET_LOG(DEBUG)
         << "GetDeviceStateProperties: Setting IPv4 properties from network: "
         << NetworkId(network);
-    if (!network->ipv4_config().is_none())
-      ip_configs.Append(network->ipv4_config().Clone());
+    if (network->ipv4_config().has_value()) {
+      ip_configs.Append(network->ipv4_config()->Clone());
+    }
   } else {
-    // Convert the DeviceState IPConfigs dictionary to a base::Value::Type::LIST
-    // Value.
-    for (const auto iter : device_state->ip_configs())
+    // Convert the DeviceState IPConfigs dictionary to a list.
+    for (const auto iter : device_state->ip_configs()) {
       ip_configs.Append(iter.second.Clone());
+    }
   }
   if (!ip_configs.empty()) {
     properties->Set(shill::kIPConfigsProperty, std::move(ip_configs));
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
index 3b63311..14a86a0 100644
--- a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
+++ b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
@@ -411,7 +411,7 @@
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, RemoveIrrelevantFields) {
   InitializeStandardProfiles();
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unconfigured_wifi1.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
@@ -424,8 +424,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 // A network policy uses a variable expansion which is set after the policy has
@@ -630,7 +629,7 @@
   InitializeStandardProfiles();
   InitializeEuicc();
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unconfigured_cellular.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, std::string(),
@@ -644,8 +643,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
   const std::string* iccid = properties->FindString(shill::kIccidProperty);
   ASSERT_TRUE(iccid);
   EXPECT_TRUE(managed_cellular_pref_handler_->GetSmdpAddressFromIccid(*iccid));
@@ -685,7 +683,7 @@
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyManageUnconfigured) {
   InitializeStandardProfiles();
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unconfigured_wifi1.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
@@ -698,13 +696,12 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, EnableManagedCredentialsWiFi) {
   InitializeStandardProfiles();
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_autoconnect_on_unconfigured_wifi1.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
@@ -717,13 +714,12 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, EnableManagedCredentialsVPN) {
   InitializeStandardProfiles();
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_autoconnect_on_unconfigured_vpn.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
@@ -744,7 +740,7 @@
 TEST_F(ManagedNetworkConfigurationHandlerTest,
        SetPolicyManageUnmanagedEthernetEAP) {
   InitializeStandardProfiles();
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/"
       "shill_policy_on_unmanaged_ethernet_eap.json");
 
@@ -773,8 +769,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyIgnoreUnmodified) {
@@ -875,7 +870,7 @@
   SetUpEntry("policy/shill_unmanaged_wifi1.json", kUser1ProfilePath,
              "old_entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unmanaged_wifi1.json");
 
   // Before setting policy, old_entry_path should exist.
@@ -894,8 +889,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyUpdateManagedNewGUID) {
@@ -903,13 +897,13 @@
   SetUpEntry("policy/shill_managed_wifi1.json", kUser1ProfilePath,
              "old_entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unmanaged_wifi1.json");
 
   // The passphrase isn't sent again, because it's configured by the user and
   // Shill doesn't send it on GetProperties calls.
-  expected_shill_properties.RemoveKey(shill::kPassphraseProperty);
-  expected_shill_properties.RemoveKey(shill::kPassphraseRequiredProperty);
+  expected_shill_properties.Remove(shill::kPassphraseProperty);
+  expected_shill_properties.Remove(shill::kPassphraseRequiredProperty);
 
   // Before setting policy, old_entry_path should exist.
   ASSERT_TRUE(GetShillProfileClient()->HasService("old_entry_path"));
@@ -927,8 +921,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, SetPolicyUpdateManagedVPN) {
@@ -945,8 +938,8 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
-      "policy/shill_policy_on_managed_vpn.json");
+  base::Value::Dict expected_shill_properties =
+      test_utils::ReadTestDictionary("policy/shill_policy_on_managed_vpn.json");
   EXPECT_EQ(expected_shill_properties, *properties);
 }
 
@@ -979,7 +972,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_managed_vpn_plus_ui.json");
   EXPECT_EQ(expected_shill_properties, *properties);
 }
@@ -1014,7 +1007,7 @@
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_managed_vpn_ipsec_plus_ui.json");
   EXPECT_EQ(expected_shill_properties, *properties);
 }
@@ -1024,8 +1017,8 @@
   InitializeStandardProfiles();
   SetUpEntry("policy/shill_managed_vpn.json", kUser1ProfilePath, "entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
-      "policy/shill_policy_on_managed_vpn.json");
+  base::Value::Dict expected_shill_properties =
+      test_utils::ReadTestDictionary("policy/shill_policy_on_managed_vpn.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
                         "policy/policy_vpn_no_user_auth_type.onc"));
@@ -1045,13 +1038,13 @@
   SetUpEntry("policy/shill_policy_on_unmanaged_wifi1.json", kUser1ProfilePath,
              "old_entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unmanaged_wifi1.json");
 
   // The passphrase isn't sent again, because it's configured by the user and
   // Shill doesn't send it on GetProperties calls.
-  expected_shill_properties.RemoveKey(shill::kPassphraseProperty);
-  expected_shill_properties.RemoveKey(shill::kPassphraseRequiredProperty);
+  expected_shill_properties.Remove(shill::kPassphraseProperty);
+  expected_shill_properties.Remove(shill::kPassphraseRequiredProperty);
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
                         "policy/policy_wifi1.onc"));
@@ -1064,8 +1057,7 @@
     const base::Value::Dict* properties =
         GetShillServiceClient()->GetServiceProperties(service_path);
     ASSERT_TRUE(properties);
-    EXPECT_THAT(*properties,
-                DictionaryHasValues(expected_shill_properties.GetDict()));
+    EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
   }
 
   // If we apply the policy again, without change, then the Shill profile will
@@ -1081,8 +1073,7 @@
     const base::Value::Dict* properties =
         GetShillServiceClient()->GetServiceProperties(service_path);
     ASSERT_TRUE(properties);
-    EXPECT_THAT(*properties,
-                DictionaryHasValues(expected_shill_properties.GetDict()));
+    EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
   }
 }
 
@@ -1124,7 +1115,7 @@
   SetUpEntry("policy/shill_unmanaged_wifi2.json", kUser1ProfilePath,
              "wifi2_entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unconfigured_wifi1.json");
 
   EXPECT_TRUE(SetPolicy(::onc::ONC_SOURCE_USER_POLICY, kUser1,
@@ -1137,8 +1128,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 // Regression test for b/237657704.
@@ -1216,7 +1206,7 @@
   SetUpEntry("policy/shill_unmanaged_wifi2.json", kUser1ProfilePath,
              "wifi2_entry_path");
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_disallow_autoconnect_on_unmanaged_wifi2.json");
 
   // Apply the user policy with global autoconnect config and expect that
@@ -1232,8 +1222,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(wifi2_service_path);
   ASSERT_TRUE(properties);
-  EXPECT_TRUE(
-      PropertiesMatch(expected_shill_properties.GetDict(), *properties));
+  EXPECT_TRUE(PropertiesMatch(expected_shill_properties, *properties));
 
   // Verify that GetManagedProperties correctly augments the properties with the
   // global config from the user policy.
@@ -1266,11 +1255,10 @@
   get_properties_run_loop.Run();
 
   ASSERT_TRUE(dictionary.has_value());
-  base::Value expected_managed_onc = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_managed_onc = test_utils::ReadTestDictionary(
       "policy/"
       "managed_onc_disallow_autoconnect_on_unmanaged_wifi2.onc");
-  EXPECT_TRUE(
-      PropertiesMatch(expected_managed_onc.GetDict(), dictionary.value()));
+  EXPECT_TRUE(PropertiesMatch(expected_managed_onc, dictionary.value()));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest, LateProfileLoading) {
@@ -1278,7 +1266,7 @@
                         "policy/policy_wifi1.onc"));
   base::RunLoop().RunUntilIdle();
 
-  base::Value expected_shill_properties = test_utils::ReadTestDictionaryValue(
+  base::Value::Dict expected_shill_properties = test_utils::ReadTestDictionary(
       "policy/shill_policy_on_unconfigured_wifi1.json");
 
   InitializeStandardProfiles();
@@ -1290,8 +1278,7 @@
   const base::Value::Dict* properties =
       GetShillServiceClient()->GetServiceProperties(service_path);
   ASSERT_TRUE(properties);
-  EXPECT_THAT(*properties,
-              DictionaryHasValues(expected_shill_properties.GetDict()));
+  EXPECT_THAT(*properties, DictionaryHasValues(expected_shill_properties));
 }
 
 TEST_F(ManagedNetworkConfigurationHandlerTest,
diff --git a/chromeos/ash/components/network/managed_state.cc b/chromeos/ash/components/network/managed_state.cc
index a92a6ee..fd17c24 100644
--- a/chromeos/ash/components/network/managed_state.cc
+++ b/chromeos/ash/components/network/managed_state.cc
@@ -78,9 +78,9 @@
   return false;
 }
 
-void ManagedState::GetStateProperties(base::Value* dictionary) const {
-  dictionary->SetKey(shill::kNameProperty, base::Value(name()));
-  dictionary->SetKey(shill::kTypeProperty, base::Value(type()));
+void ManagedState::GetStateProperties(base::Value::Dict* dictionary) const {
+  dictionary->Set(shill::kNameProperty, name());
+  dictionary->Set(shill::kTypeProperty, type());
 }
 
 bool ManagedState::ManagedStatePropertyChanged(const std::string& key,
diff --git a/chromeos/ash/components/network/managed_state.h b/chromeos/ash/components/network/managed_state.h
index f73efa2..7c13857 100644
--- a/chromeos/ash/components/network/managed_state.h
+++ b/chromeos/ash/components/network/managed_state.h
@@ -69,10 +69,9 @@
   // additional properties are updated.
   virtual bool InitialPropertiesReceived(const base::Value::Dict& properties);
 
-  // Fills |dictionary|, which must be of type DICTIONARY, with a minimal set of
-  // state properties for the network type. See implementations for which
-  // properties are included.
-  virtual void GetStateProperties(base::Value* dictionary) const;
+  // Fills |dictionary| with a minimal set of state properties for the network
+  // type. See implementations for which properties are included.
+  virtual void GetStateProperties(base::Value::Dict* dictionary) const;
 
   // Returns true if a state is "Active". For networks that means connected,
   // connecting, or activating. Devices are always "active".
diff --git a/chromeos/ash/components/network/network_cert_migrator_unittest.cc b/chromeos/ash/components/network/network_cert_migrator_unittest.cc
index 2aad613..a9aa573 100644
--- a/chromeos/ash/components/network/network_cert_migrator_unittest.cc
+++ b/chromeos/ash/components/network/network_cert_migrator_unittest.cc
@@ -165,22 +165,17 @@
                           const std::string& slot_id,
                           const std::string& pkcs11_id) {
     AddService(shill_profile, kVPNStub, shill::kTypeVPN, shill::kStateIdle);
-    base::Value provider(base::Value::Type::DICT);
+    base::Value::Dict provider;
     if (open_vpn) {
-      provider.SetKey(shill::kTypeProperty,
-                      base::Value(shill::kProviderOpenVpn));
-      provider.SetKey(shill::kOpenVPNClientCertIdProperty,
-                      base::Value(pkcs11_id));
+      provider.Set(shill::kTypeProperty, shill::kProviderOpenVpn);
+      provider.Set(shill::kOpenVPNClientCertIdProperty, pkcs11_id);
     } else {
-      provider.SetKey(shill::kTypeProperty,
-                      base::Value(shill::kProviderL2tpIpsec));
-      provider.SetKey(shill::kL2TPIPsecClientCertSlotProperty,
-                      base::Value(slot_id));
-      provider.SetKey(shill::kL2TPIPsecClientCertIdProperty,
-                      base::Value(pkcs11_id));
+      provider.Set(shill::kTypeProperty, shill::kProviderL2tpIpsec);
+      provider.Set(shill::kL2TPIPsecClientCertSlotProperty, slot_id);
+      provider.Set(shill::kL2TPIPsecClientCertIdProperty, pkcs11_id);
     }
     service_test_->SetServiceProperty(kVPNStub, shill::kProviderProperty,
-                                      provider);
+                                      base::Value(std::move(provider)));
   }
 
   void GetVpnCertId(bool open_vpn,
diff --git a/chromeos/ash/components/network/network_configuration_handler.cc b/chromeos/ash/components/network/network_configuration_handler.cc
index d78bf694..ab2c3e87 100644
--- a/chromeos/ash/components/network/network_configuration_handler.cc
+++ b/chromeos/ash/components/network/network_configuration_handler.cc
@@ -266,9 +266,9 @@
        network_state->IsNonShillCellularNetwork())) {
     // This is a Tether network or a Cellular network with no Service.
     // Provide properties from NetworkState.
-    base::Value dictionary(base::Value::Type::DICT);
+    base::Value::Dict dictionary;
     network_state->GetStateProperties(&dictionary);
-    std::move(callback).Run(service_path, std::move(dictionary.GetDict()));
+    std::move(callback).Run(service_path, std::move(dictionary));
     return;
   }
   ShillServiceClient::Get()->GetProperties(
diff --git a/chromeos/ash/components/network/network_connect.cc b/chromeos/ash/components/network/network_connect.cc
index dab3b2f..9079da4 100644
--- a/chromeos/ash/components/network/network_connect.cc
+++ b/chromeos/ash/components/network/network_connect.cc
@@ -68,7 +68,7 @@
   void ShowCarrierAccountDetail(const std::string& network_id) override;
   void ShowPortalSignin(const std::string& network_id, Source source) override;
   void ConfigureNetworkIdAndConnect(const std::string& network_id,
-                                    const base::Value& shill_properties,
+                                    const base::Value::Dict& shill_properties,
                                     bool shared) override;
   void CreateConfigurationAndConnect(base::Value::Dict shill_properties,
                                      bool shared) override;
@@ -94,13 +94,13 @@
   void SetPropertiesFailed(const std::string& desc,
                            const std::string& network_id,
                            const std::string& config_error_name);
-  void SetPropertiesToClear(base::Value* properties_to_set,
+  void SetPropertiesToClear(base::Value::Dict* properties_to_set,
                             std::vector<std::string>* properties_to_clear);
   void ClearPropertiesAndConnect(
       const std::string& network_id,
       const std::vector<std::string>& properties_to_clear);
   void ConfigureSetProfileSucceeded(const std::string& network_id,
-                                    base::Value properties_to_set);
+                                    base::Value::Dict properties_to_set);
 
   Delegate* delegate_;
   base::WeakPtrFactory<NetworkConnectImpl> weak_factory_{this};
@@ -297,18 +297,20 @@
 }
 
 void NetworkConnectImpl::SetPropertiesToClear(
-    base::Value* properties_to_set,
+    base::Value::Dict* properties_to_set,
     std::vector<std::string>* properties_to_clear) {
   // Move empty string properties to properties_to_clear.
-  for (auto iter : properties_to_set->DictItems()) {
-    if (!iter.second.is_string())
+  for (auto iter : *properties_to_set) {
+    if (!iter.second.is_string()) {
       continue;
-    if (iter.second.GetString().empty())
+    }
+    if (iter.second.GetString().empty()) {
       properties_to_clear->push_back(iter.first);
+    }
   }
   // Remove cleared properties from properties_to_set.
   for (const std::string& property_to_clear : *properties_to_clear) {
-    properties_to_set->RemoveKey(property_to_clear);
+    properties_to_set->Remove(property_to_clear);
   }
 }
 
@@ -335,7 +337,7 @@
 
 void NetworkConnectImpl::ConfigureSetProfileSucceeded(
     const std::string& network_id,
-    base::Value properties_to_set) {
+    base::Value::Dict properties_to_set) {
   std::vector<std::string> properties_to_clear;
   SetPropertiesToClear(&properties_to_set, &properties_to_clear);
   const NetworkState* network = GetNetworkStateFromId(network_id);
@@ -345,7 +347,7 @@
     return;
   }
   NetworkHandler::Get()->network_configuration_handler()->SetShillProperties(
-      network->path(), properties_to_set.GetDict(),
+      network->path(), properties_to_set,
       base::BindOnce(&NetworkConnectImpl::ClearPropertiesAndConnect,
                      weak_factory_.GetWeakPtr(), network_id,
                      properties_to_clear),
@@ -499,12 +501,12 @@
 
 void NetworkConnectImpl::ConfigureNetworkIdAndConnect(
     const std::string& network_id,
-    const base::Value& properties,
+    const base::Value::Dict& properties,
     bool shared) {
   NET_LOG(USER) << "ConfigureNetworkIdAndConnect: "
                 << NetworkGuidId(network_id);
 
-  base::Value properties_to_set = properties.Clone();
+  base::Value::Dict properties_to_set = properties.Clone();
 
   std::string profile_path;
   if (!GetNetworkProfilePath(shared, &profile_path)) {
diff --git a/chromeos/ash/components/network/network_connect.h b/chromeos/ash/components/network/network_connect.h
index 701982b..2adc2324 100644
--- a/chromeos/ash/components/network/network_connect.h
+++ b/chromeos/ash/components/network/network_connect.h
@@ -60,7 +60,7 @@
     virtual void ShowMobileActivationError(const std::string& network_id) = 0;
 
    protected:
-    virtual ~Delegate() {}
+    virtual ~Delegate() = default;
   };
 
   // Creates the global NetworkConnect object. |delegate| is owned by the
@@ -107,9 +107,10 @@
   // Configures a network with a dictionary of Shill properties, then sends a
   // connect request. The profile is set according to 'shared' if allowed.
   // TODO(stevenjb): Use ONC properties instead of shill.
-  virtual void ConfigureNetworkIdAndConnect(const std::string& network_id,
-                                            const base::Value& shill_properties,
-                                            bool shared) = 0;
+  virtual void ConfigureNetworkIdAndConnect(
+      const std::string& network_id,
+      const base::Value::Dict& shill_properties,
+      bool shared) = 0;
 
   // Requests a new network configuration to be created from a dictionary of
   // Shill properties and sends a connect request if the configuration succeeds.
diff --git a/chromeos/ash/components/network/network_connect_unittest.cc b/chromeos/ash/components/network/network_connect_unittest.cc
index 9110372..e1b034c 100644
--- a/chromeos/ash/components/network/network_connect_unittest.cc
+++ b/chromeos/ash/components/network/network_connect_unittest.cc
@@ -230,7 +230,7 @@
               ShowNetworkConnectError(NetworkConnectionHandler::kErrorNotFound,
                                       "bad guid"));
 
-  base::Value properties(base::Value::Type::DICT);
+  base::Value::Dict properties;
   NetworkConnect::Get()->ConfigureNetworkIdAndConnect("bad guid", properties,
                                                       true);
 }
@@ -241,7 +241,7 @@
               ShowNetworkConnectError(
                   NetworkConnectionHandler::kErrorConfigureFailed, kWiFi1Guid));
 
-  base::Value properties(base::Value::Type::DICT);
+  base::Value::Dict properties;
   NetworkConnect::Get()->ConfigureNetworkIdAndConnect(kWiFi1Guid, properties,
                                                       false);
 }
diff --git a/chromeos/ash/components/network/network_event_log_unittest.cc b/chromeos/ash/components/network/network_event_log_unittest.cc
index 72c48c39..627dbae 100644
--- a/chromeos/ash/components/network/network_event_log_unittest.cc
+++ b/chromeos/ash/components/network/network_event_log_unittest.cc
@@ -84,18 +84,19 @@
     // VPN
     service_test->AddService("/service/5", "vpn5_guid", "vpn5", shill::kTypeVPN,
                              shill::kStateIdle, add_to_visible);
-    base::Value provider_properties(base::Value::Type::DICT);
-    provider_properties.SetStringKey(shill::kTypeProperty,
-                                     shill::kProviderL2tpIpsec);
-    service_test->SetServiceProperty("/service/5", shill::kProviderProperty,
-                                     provider_properties);
+    base::Value::Dict provider_properties;
+    provider_properties.Set(shill::kTypeProperty, shill::kProviderL2tpIpsec);
+    service_test->SetServiceProperty(
+        "/service/5", shill::kProviderProperty,
+        base::Value(std::move(provider_properties)));
 
+    base::Value::Dict provider_properties2;
     service_test->AddService("/service/6", "vpn6_guid", "vpn6", shill::kTypeVPN,
                              shill::kStateIdle, add_to_visible);
-    provider_properties.SetStringKey(shill::kTypeProperty,
-                                     shill::kProviderOpenVpn);
-    service_test->SetServiceProperty("/service/6", shill::kProviderProperty,
-                                     provider_properties);
+    provider_properties2.Set(shill::kTypeProperty, shill::kProviderOpenVpn);
+    service_test->SetServiceProperty(
+        "/service/6", shill::kProviderProperty,
+        base::Value(std::move(provider_properties2)));
 
     base::RunLoop().RunUntilIdle();
   }
diff --git a/chromeos/ash/components/network/network_state.cc b/chromeos/ash/components/network/network_state.cc
index 4badfa7d..51849a87 100644
--- a/chromeos/ash/components/network/network_state.cc
+++ b/chromeos/ash/components/network/network_state.cc
@@ -41,9 +41,11 @@
 constexpr char kPaymentPortalMethodPost[] = "POST";
 
 // |dict| may be an empty value, in which case return an empty string.
-std::string GetStringFromDictionary(const base::Value& dict, const char* key) {
+std::string GetStringFromDictionary(
+    const absl::optional<base::Value::Dict>& dict,
+    const char* key) {
   const std::string* stringp =
-      dict.is_none() ? nullptr : dict.FindStringKey(key);
+      dict.has_value() ? dict->FindString(key) : nullptr;
   return stringp ? *stringp : std::string();
 }
 
@@ -119,22 +121,25 @@
   } else if (key == shill::kCellularAllowRoamingProperty) {
     return GetBooleanValue(key, value, &allow_roaming_);
   } else if (key == shill::kPaymentPortalProperty) {
-    if (!value.is_dict())
+    const base::Value::Dict* value_dict = value.GetIfDict();
+    if (!value_dict) {
       return false;
-    const base::Value* portal_url_value = value.FindKeyOfType(
-        shill::kPaymentPortalURL, base::Value::Type::STRING);
-    if (!portal_url_value)
+    }
+    const std::string* portal_url_value =
+        value_dict->FindString(shill::kPaymentPortalURL);
+    if (!portal_url_value) {
       return false;
-    payment_url_ = portal_url_value->GetString();
+    }
+    payment_url_ = *portal_url_value;
     // If payment portal uses post method, set up post data.
-    const base::Value* portal_method_value = value.FindKeyOfType(
-        shill::kPaymentPortalMethod, base::Value::Type::STRING);
-    const base::Value* portal_post_data_value = value.FindKeyOfType(
-        shill::kPaymentPortalPostData, base::Value::Type::STRING);
+    const std::string* portal_method_value =
+        value_dict->FindString(shill::kPaymentPortalMethod);
+    const std::string* portal_post_data_value =
+        value_dict->FindString(shill::kPaymentPortalPostData);
     if (portal_method_value &&
-        portal_method_value->GetString() == kPaymentPortalMethodPost &&
+        *portal_method_value == kPaymentPortalMethodPost &&
         portal_post_data_value) {
-      payment_post_data_ = portal_post_data_value->GetString();
+      payment_post_data_ = *portal_post_data_value;
     }
     return true;
   } else if (key == shill::kSecurityClassProperty) {
@@ -177,42 +182,40 @@
     }
 
     if ((*proxy_config_str).empty()) {
-      proxy_config_ = base::Value();
+      proxy_config_.reset();
       return true;
     }
     absl::optional<base::Value::Dict> proxy_config =
         chromeos::onc::ReadDictionaryFromJson(*proxy_config_str);
     if (!proxy_config.has_value()) {
       NET_LOG(ERROR) << "Failed to parse " << path() << "." << key;
-      proxy_config_ = base::Value();
+      proxy_config_.reset();
     } else {
-      proxy_config_ = base::Value(std::move(*proxy_config));
+      proxy_config_ = std::move(proxy_config.value());
     }
     return true;
   } else if (key == shill::kProviderProperty) {
-    const base::Value* type_value =
-        value.is_dict() ? value.FindKeyOfType(shill::kTypeProperty,
-                                              base::Value::Type::STRING)
+    const std::string* vpn_provider_type =
+        value.is_dict() ? value.GetDict().FindString(shill::kTypeProperty)
                         : nullptr;
-    if (!type_value) {
+    if (!vpn_provider_type) {
       NET_LOG(ERROR) << "Failed to parse " << path() << "." << key;
       return false;
     }
-    std::string vpn_provider_type = type_value->GetString();
     std::string vpn_provider_id;
-    if (vpn_provider_type == shill::kProviderThirdPartyVpn ||
-        vpn_provider_type == shill::kProviderArcVpn) {
+    if (*vpn_provider_type == shill::kProviderThirdPartyVpn ||
+        *vpn_provider_type == shill::kProviderArcVpn) {
       // If the network uses a third-party or Arc VPN provider,
       // |shill::kHostProperty| contains the extension ID or Arc package name.
-      const base::Value* host_value =
-          value.FindKeyOfType(shill::kHostProperty, base::Value::Type::STRING);
-      if (!host_value) {
+      const std::string* host =
+          value.GetDict().FindString(shill::kHostProperty);
+      if (!host) {
         NET_LOG(ERROR) << "Failed to parse " << path() << "." << key;
         return false;
       }
-      vpn_provider_id = host_value->GetString();
+      vpn_provider_id = *host;
     }
-    SetVpnProvider(vpn_provider_id, vpn_provider_type);
+    SetVpnProvider(vpn_provider_id, *vpn_provider_type);
     return true;
   } else if (key == shill::kUIDataProperty) {
     std::unique_ptr<NetworkUIData> ui_data =
@@ -273,47 +276,45 @@
   return UpdateName(properties);
 }
 
-void NetworkState::GetStateProperties(base::Value* dictionary) const {
+void NetworkState::GetStateProperties(base::Value::Dict* dictionary) const {
   ManagedState::GetStateProperties(dictionary);
 
   // Properties shared by all types.
-  dictionary->SetKey(shill::kGuidProperty, base::Value(guid()));
-  dictionary->SetKey(shill::kSecurityClassProperty,
-                     base::Value(security_class()));
-  dictionary->SetKey(shill::kProfileProperty, base::Value(profile_path()));
-  dictionary->SetKey(shill::kPriorityProperty, base::Value(priority_));
+  dictionary->Set(shill::kGuidProperty, guid());
+  dictionary->Set(shill::kSecurityClassProperty, security_class());
+  dictionary->Set(shill::kProfileProperty, profile_path());
+  dictionary->Set(shill::kPriorityProperty, priority_);
 
-  if (visible())
-    dictionary->SetKey(shill::kStateProperty, base::Value(connection_state()));
-  if (!device_path().empty())
-    dictionary->SetKey(shill::kDeviceProperty, base::Value(device_path()));
+  if (visible()) {
+    dictionary->Set(shill::kStateProperty, connection_state());
+  }
+  if (!device_path().empty()) {
+    dictionary->Set(shill::kDeviceProperty, device_path());
+  }
 
   // VPN properties.
   if (NetworkTypePattern::VPN().MatchesType(type()) && vpn_provider()) {
     // Shill sends VPN provider properties in a nested dictionary. |dictionary|
     // must replicate that nested structure.
     std::string provider_type = vpn_provider()->type;
-    base::Value provider_property(base::Value::Type::DICT);
-    provider_property.SetKey(shill::kTypeProperty, base::Value(provider_type));
+    base::Value::Dict provider_property;
+    provider_property.Set(shill::kTypeProperty, provider_type);
     if (provider_type == shill::kProviderThirdPartyVpn ||
         provider_type == shill::kProviderArcVpn) {
-      provider_property.SetKey(shill::kHostProperty,
-                               base::Value(vpn_provider()->id));
+      provider_property.Set(shill::kHostProperty, vpn_provider()->id);
     }
-    dictionary->SetKey(shill::kProviderProperty, std::move(provider_property));
+    dictionary->Set(shill::kProviderProperty, std::move(provider_property));
   }
 
   // Tether properties
   if (NetworkTypePattern::Tether().MatchesType(type())) {
-    dictionary->SetKey(kTetherBatteryPercentage,
-                       base::Value(battery_percentage()));
-    dictionary->SetKey(kTetherCarrier, base::Value(tether_carrier()));
-    dictionary->SetKey(kTetherHasConnectedToHost,
-                       base::Value(tether_has_connected_to_host()));
-    dictionary->SetKey(kTetherSignalStrength, base::Value(signal_strength()));
+    dictionary->Set(kTetherBatteryPercentage, battery_percentage());
+    dictionary->Set(kTetherCarrier, tether_carrier());
+    dictionary->Set(kTetherHasConnectedToHost, tether_has_connected_to_host());
+    dictionary->Set(kTetherSignalStrength, signal_strength());
 
     // All Tether networks are connectable.
-    dictionary->SetKey(shill::kConnectableProperty, base::Value(connectable()));
+    dictionary->Set(shill::kConnectableProperty, connectable());
 
     // Tether networks do not share some of the wireless/mobile properties added
     // below; exit early to avoid having these properties applied.
@@ -325,34 +326,30 @@
     return;
 
   if (visible()) {
-    dictionary->SetKey(shill::kConnectableProperty, base::Value(connectable()));
-    dictionary->SetKey(shill::kSignalStrengthProperty,
-                       base::Value(signal_strength()));
+    dictionary->Set(shill::kConnectableProperty, connectable());
+    dictionary->Set(shill::kSignalStrengthProperty, signal_strength());
   }
 
   // Wifi properties
   if (NetworkTypePattern::WiFi().MatchesType(type())) {
-    dictionary->SetKey(shill::kWifiBSsid, base::Value(bssid_));
-    dictionary->SetKey(shill::kEapMethodProperty, base::Value(eap_method()));
-    dictionary->SetKey(shill::kWifiFrequency, base::Value(frequency_));
-    dictionary->SetKey(shill::kWifiHexSsid, base::Value(GetHexSsid()));
+    dictionary->Set(shill::kWifiBSsid, bssid_);
+    dictionary->Set(shill::kEapMethodProperty, eap_method());
+    dictionary->Set(shill::kWifiFrequency, frequency_);
+    dictionary->Set(shill::kWifiHexSsid, GetHexSsid());
   }
 
   // Mobile properties
   if (NetworkTypePattern::Mobile().MatchesType(type())) {
-    dictionary->SetKey(shill::kNetworkTechnologyProperty,
-                       base::Value(network_technology()));
-    dictionary->SetKey(shill::kActivationStateProperty,
-                       base::Value(activation_state()));
-    dictionary->SetKey(shill::kRoamingStateProperty, base::Value(roaming_));
-    dictionary->SetKey(shill::kOutOfCreditsProperty,
-                       base::Value(cellular_out_of_credits()));
+    dictionary->Set(shill::kNetworkTechnologyProperty, network_technology());
+    dictionary->Set(shill::kActivationStateProperty, activation_state());
+    dictionary->Set(shill::kRoamingStateProperty, roaming_);
+    dictionary->Set(shill::kOutOfCreditsProperty, cellular_out_of_credits());
   }
 
   // Cellular properties
   if (NetworkTypePattern::Cellular().MatchesType(type())) {
-    dictionary->SetKey(shill::kIccidProperty, base::Value(iccid()));
-    dictionary->SetKey(shill::kEidProperty, base::Value(eid()));
+    dictionary->Set(shill::kIccidProperty, iccid());
+    dictionary->Set(shill::kEidProperty, eid());
   }
 }
 
@@ -364,10 +361,10 @@
 void NetworkState::IPConfigPropertiesChanged(
     const base::Value::Dict& properties) {
   if (properties.empty()) {
-    ipv4_config_ = base::Value();
+    ipv4_config_.reset();
     return;
   }
-  ipv4_config_ = base::Value(properties.Clone());
+  ipv4_config_ = properties.Clone();
 }
 
 std::string NetworkState::GetIpAddress() const {
@@ -515,24 +512,25 @@
 }
 
 std::string NetworkState::GetDnsServersAsString() const {
-  const base::Value* listv =
-      ipv4_config_.is_none()
-          ? nullptr
-          : ipv4_config_.FindListKey(shill::kNameServersProperty);
-  if (!listv)
+  const base::Value::List* list =
+      ipv4_config_.has_value()
+          ? ipv4_config_->FindList(shill::kNameServersProperty)
+          : nullptr;
+  if (!list) {
     return std::string();
+  }
   std::string result;
-  for (const auto& v : listv->GetList()) {
-    if (!result.empty())
+  for (const auto& v : *list) {
+    if (!result.empty()) {
       result += ",";
+    }
     result += v.GetString();
   }
   return result;
 }
 
 std::string NetworkState::GetNetmask() const {
-  int prefixlen =
-      ipv4_config_.FindIntKey(shill::kPrefixlenProperty).value_or(-1);
+  int prefixlen = ipv4_config_->FindInt(shill::kPrefixlenProperty).value_or(-1);
   return network_util::PrefixLengthToNetmask(prefixlen);
 }
 
diff --git a/chromeos/ash/components/network/network_state.h b/chromeos/ash/components/network/network_state.h
index 0e09b26..7c3d08a5 100644
--- a/chromeos/ash/components/network/network_state.h
+++ b/chromeos/ash/components/network/network_state.h
@@ -17,6 +17,7 @@
 #include "chromeos/ash/components/network/managed_state.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom-forward.h"
 #include "components/onc/onc_constants.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 #include "url/gurl.h"
 
@@ -76,7 +77,7 @@
   bool PropertyChanged(const std::string& key,
                        const base::Value& value) override;
   bool InitialPropertiesReceived(const base::Value::Dict& properties) override;
-  void GetStateProperties(base::Value* dictionary) const override;
+  void GetStateProperties(base::Value::Dict* dictionary) const override;
   bool IsActive() const override;
 
   // Called when the IPConfig properties may have changed. |properties| is
@@ -117,8 +118,12 @@
 
   int priority() const { return priority_; }
 
-  const base::Value& proxy_config() const { return proxy_config_; }
-  const base::Value& ipv4_config() const { return ipv4_config_; }
+  const absl::optional<base::Value::Dict>& proxy_config() const {
+    return proxy_config_;
+  }
+  const absl::optional<base::Value::Dict>& ipv4_config() const {
+    return ipv4_config_;
+  }
   std::string GetIpAddress() const;
   std::string GetGateway() const;
   GURL GetWebProxyAutoDiscoveryUrl() const;
@@ -202,7 +207,7 @@
   // roaming.
   bool IndicateRoaming() const;
 
-  // Returns true if the network securty is WEP_8021x (Dynamic WEP)
+  // Returns true if the network security is WEP_8021x (Dynamic WEP)
   bool IsDynamicWep() const;
 
   // Returns true if |connection_state_| is a connected/connecting state.
@@ -349,7 +354,7 @@
 
   // Cached copy of the Shill Service IPConfig object. For ipv6 properties use
   // the ip_configs_ property in the corresponding DeviceState.
-  base::Value ipv4_config_;
+  absl::optional<base::Value::Dict> ipv4_config_;
 
   // Wireless properties, used for icons and Connect logic.
   bool connectable_ = false;
@@ -396,7 +401,7 @@
 
   // TODO(pneubeck): Remove this once (Managed)NetworkConfigurationHandler
   // provides proxy configuration. crbug.com/241775
-  base::Value proxy_config_;
+  absl::optional<base::Value::Dict> proxy_config_;
 
   // Set while a network connect request is queued. Cleared on connect or
   // if the request is aborted.
diff --git a/chromeos/ash/components/network/network_state_handler.cc b/chromeos/ash/components/network/network_state_handler.cc
index 54590ee..9777e17 100644
--- a/chromeos/ash/components/network/network_state_handler.cc
+++ b/chromeos/ash/components/network/network_state_handler.cc
@@ -1412,7 +1412,8 @@
   UpdateBlockedNetworksInternal(NetworkTypePattern::Cellular());
 }
 
-void NetworkStateHandler::ProfileListChanged(const base::Value& profile_list) {
+void NetworkStateHandler::ProfileListChanged(
+    const base::Value::List& profile_list) {
   NET_LOG(EVENT) << "ProfileListChanged. Re-Requesting Network Properties";
   ProcessIsUserLoggedIn(profile_list);
   for (ManagedStateList::iterator iter = network_list_.begin();
@@ -2121,12 +2122,16 @@
        default_network->proxy_config() != default_network_proxy_config_)) {
     new_portal_state = default_network->shill_portal_state();
     new_default_network_path = default_network->path();
-    default_network_proxy_config_ = default_network->proxy_config().Clone();
+    if (default_network->proxy_config()) {
+      default_network_proxy_config_ = default_network->proxy_config()->Clone();
+    } else {
+      default_network_proxy_config_.reset();
+    }
   } else if (!default_network && (default_network_portal_state_ !=
                                       NetworkState::PortalState::kUnknown ||
-                                  !default_network_proxy_config_.is_none())) {
+                                  default_network_proxy_config_.has_value())) {
     new_portal_state = NetworkState::PortalState::kUnknown;
-    default_network_proxy_config_ = base::Value();
+    default_network_proxy_config_.reset();
   } else {
     // No portal state changes.
     return;
@@ -2347,13 +2352,10 @@
 }
 
 void NetworkStateHandler::ProcessIsUserLoggedIn(
-    const base::Value& profile_list) {
-  if (!profile_list.is_list()) {
-    return;
-  }
+    const base::Value::List& profile_list) {
   // The profile list contains the shared profile on the login screen. Once the
   // user is logged in there is more than one profile in the profile list.
-  is_user_logged_in_ = profile_list.GetList().size() > 1;
+  is_user_logged_in_ = profile_list.size() > 1;
 }
 
 }  // namespace ash
diff --git a/chromeos/ash/components/network/network_state_handler.h b/chromeos/ash/components/network/network_state_handler.h
index 33e6f471..deb8eff 100644
--- a/chromeos/ash/components/network/network_state_handler.h
+++ b/chromeos/ash/components/network/network_state_handler.h
@@ -488,7 +488,7 @@
 
   // The list of profiles changed (i.e. a user has logged in). Re-request
   // properties for all services since they may have changed.
-  void ProfileListChanged(const base::Value& profile_list) override;
+  void ProfileListChanged(const base::Value::List& profile_list) override;
 
   // Parses the properties for the network service or device. Mostly calls
   // managed->PropertyChanged(key, value) for each dictionary entry.
@@ -746,7 +746,7 @@
   void SetDefaultNetworkValues(const std::string& path, bool metered);
 
   // Determines whether the user is logged in and sets |is_user_logged_in_|.
-  void ProcessIsUserLoggedIn(const base::Value& profile_list);
+  void ProcessIsUserLoggedIn(const base::Value::List& profile_list);
 
   // Shill property handler instance, owned by this class.
   std::unique_ptr<internal::ShillPropertyHandler> shill_property_handler_;
@@ -791,7 +791,7 @@
   absl::optional<base::ElapsedTimer> time_in_portal_;
 
   // Tracks the default network proxy config for triggering PortalStateChanged.
-  base::Value default_network_proxy_config_;
+  absl::optional<base::Value::Dict> default_network_proxy_config_;
 
   // DHCP Hostname.
   std::string hostname_;
diff --git a/chromeos/ash/components/network/network_state_unittest.cc b/chromeos/ash/components/network/network_state_unittest.cc
index 2c7d44b..6ab40093 100644
--- a/chromeos/ash/components/network/network_state_unittest.cc
+++ b/chromeos/ash/components/network/network_state_unittest.cc
@@ -55,7 +55,7 @@
 
   bool SetProperty(const std::string& key, base::Value value) {
     const bool result = network_state_->PropertyChanged(key, value);
-    properties_.SetKey(key, std::move(value));
+    properties_.Set(key, std::move(value));
     return result;
   }
 
@@ -64,15 +64,15 @@
   }
 
   bool SignalInitialPropertiesReceived() {
-    return network_state_->InitialPropertiesReceived(properties_.GetDict());
+    return network_state_->InitialPropertiesReceived(properties_);
   }
 
   void SetConnectionState(const std::string& connection_state) {
     network_state_->SetConnectionState(connection_state);
   }
 
-  void UpdateCaptivePortalState(const base::Value& properties) {
-    network_state_->UpdateCaptivePortalState(properties.GetDict());
+  void UpdateCaptivePortalState(const base::Value::Dict& properties) {
+    network_state_->UpdateCaptivePortalState(properties);
   }
 
   NetworkState::PortalState GetShillPortalState() {
@@ -91,7 +91,7 @@
   base::test::SingleThreadTaskEnvironment task_environment_;
   NetworkStateTestHelper helper_{/*use_default_devices_and_services=*/false};
 
-  base::Value properties_{base::Value::Type::DICT};
+  base::Value::Dict properties_;
 };
 
 // Setting kNameProperty should set network name after call to
@@ -165,9 +165,9 @@
   EXPECT_EQ(wifi_hex_result, network_state_->name());
 
   // Check HexSSID via network state dictionary.
-  base::Value dictionary(base::Value::Type::DICT);
+  base::Value::Dict dictionary;
   network_state_->GetStateProperties(&dictionary);
-  std::string* value = dictionary.FindStringKey(shill::kWifiHexSsid);
+  std::string* value = dictionary.FindString(shill::kWifiHexSsid);
   EXPECT_NE(nullptr, value);
   EXPECT_EQ(wifi_hex, *value);
 }
@@ -249,12 +249,11 @@
   EXPECT_TRUE(SetStringProperty(shill::kTypeProperty, shill::kTypeVPN));
   EXPECT_TRUE(SetStringProperty(shill::kNameProperty, "VPN"));
 
-  base::Value provider(base::Value::Type::DICT);
-  provider.SetKey(shill::kTypeProperty,
-                  base::Value(shill::kProviderThirdPartyVpn));
-  provider.SetKey(shill::kHostProperty,
-                  base::Value("third-party-vpn-provider-extension-id"));
-  EXPECT_TRUE(SetProperty(shill::kProviderProperty, std::move(provider)));
+  base::Value::Dict provider;
+  provider.Set(shill::kTypeProperty, shill::kProviderThirdPartyVpn);
+  provider.Set(shill::kHostProperty, "third-party-vpn-provider-extension-id");
+  EXPECT_TRUE(
+      SetProperty(shill::kProviderProperty, base::Value(std::move(provider))));
   SignalInitialPropertiesReceived();
   ASSERT_TRUE(network_state_->vpn_provider());
   EXPECT_EQ(network_state_->vpn_provider()->type,
@@ -268,10 +267,11 @@
   EXPECT_TRUE(SetStringProperty(shill::kTypeProperty, shill::kTypeVPN));
   EXPECT_TRUE(SetStringProperty(shill::kNameProperty, "VPN"));
 
-  base::Value provider(base::Value::Type::DICT);
-  provider.SetKey(shill::kTypeProperty, base::Value(shill::kProviderArcVpn));
-  provider.SetKey(shill::kHostProperty, base::Value("package.name.foo"));
-  EXPECT_TRUE(SetProperty(shill::kProviderProperty, std::move(provider)));
+  base::Value::Dict provider;
+  provider.Set(shill::kTypeProperty, shill::kProviderArcVpn);
+  provider.Set(shill::kHostProperty, "package.name.foo");
+  EXPECT_TRUE(
+      SetProperty(shill::kProviderProperty, base::Value(std::move(provider))));
   SignalInitialPropertiesReceived();
   ASSERT_TRUE(network_state_->vpn_provider());
   EXPECT_EQ(network_state_->vpn_provider()->type, shill::kProviderArcVpn);
@@ -379,25 +379,25 @@
   network_state_->set_tether_has_connected_to_host(true);
   network_state_->set_signal_strength(75);
 
-  base::Value dictionary(base::Value::Type::DICT);
+  base::Value::Dict dictionary;
   network_state_->GetStateProperties(&dictionary);
 
   absl::optional<int> signal_strength =
-      dictionary.GetDict().FindInt(kTetherSignalStrength);
+      dictionary.FindInt(kTetherSignalStrength);
   EXPECT_TRUE(signal_strength.has_value());
   EXPECT_EQ(75, signal_strength.value());
 
   absl::optional<int> battery_percentage =
-      dictionary.GetDict().FindInt(kTetherBatteryPercentage);
+      dictionary.FindInt(kTetherBatteryPercentage);
   EXPECT_TRUE(battery_percentage.has_value());
   EXPECT_EQ(85, battery_percentage.value());
 
   absl::optional<bool> tether_has_connected_to_host =
-      dictionary.GetDict().FindBool(kTetherHasConnectedToHost);
+      dictionary.FindBool(kTetherHasConnectedToHost);
   EXPECT_TRUE(tether_has_connected_to_host.has_value());
   EXPECT_TRUE(tether_has_connected_to_host.value());
 
-  std::string* carrier = dictionary.GetDict().FindString(kTetherCarrier);
+  std::string* carrier = dictionary.FindString(kTetherCarrier);
   EXPECT_NE(nullptr, carrier);
   EXPECT_EQ("Project Fi", *carrier);
 }
@@ -412,15 +412,13 @@
   EXPECT_TRUE(SetStringProperty(shill::kActivationStateProperty,
                                 shill::kActivationStateActivated));
 
-  base::Value payment_portal(base::Value::Type::DICT);
-  payment_portal.SetKey(shill::kPaymentPortalURL,
-                        base::Value("http://test-portal.com"));
-  payment_portal.SetKey(shill::kPaymentPortalMethod, base::Value("POST"));
-  payment_portal.SetKey(shill::kPaymentPortalPostData,
-                        base::Value("fake_data"));
+  base::Value::Dict payment_portal;
+  payment_portal.Set(shill::kPaymentPortalURL, "http://test-portal.com");
+  payment_portal.Set(shill::kPaymentPortalMethod, "POST");
+  payment_portal.Set(shill::kPaymentPortalPostData, "fake_data");
 
-  EXPECT_TRUE(
-      SetProperty(shill::kPaymentPortalProperty, std::move(payment_portal)));
+  EXPECT_TRUE(SetProperty(shill::kPaymentPortalProperty,
+                          base::Value(std::move(payment_portal))));
 
   SignalInitialPropertiesReceived();
   EXPECT_EQ("Test Cellular", network_state_->name());
@@ -443,14 +441,13 @@
   EXPECT_TRUE(SetStringProperty(shill::kActivationStateProperty,
                                 shill::kActivationStateActivated));
 
-  base::Value payment_portal(base::Value::Type::DICT);
-  payment_portal.SetKey(shill::kPaymentPortalURL,
-                        base::Value("http://test-portal.com"));
-  payment_portal.SetKey(shill::kPaymentPortalMethod, base::Value("GET"));
-  payment_portal.SetKey(shill::kPaymentPortalPostData, base::Value("ignored"));
+  base::Value::Dict payment_portal;
+  payment_portal.Set(shill::kPaymentPortalURL, "http://test-portal.com");
+  payment_portal.Set(shill::kPaymentPortalMethod, "GET");
+  payment_portal.Set(shill::kPaymentPortalPostData, "ignored");
 
-  EXPECT_TRUE(
-      SetProperty(shill::kPaymentPortalProperty, std::move(payment_portal)));
+  EXPECT_TRUE(SetProperty(shill::kPaymentPortalProperty,
+                          base::Value(std::move(payment_portal))));
 
   SignalInitialPropertiesReceived();
 
@@ -496,11 +493,11 @@
   EXPECT_EQ(kTestGuid, non_shill_cellular->guid());
   EXPECT_FALSE(non_shill_cellular->IsManagedByPolicy());
 
-  base::Value dictionary(base::Value::Type::DICT);
+  base::Value::Dict dictionary;
   non_shill_cellular->GetStateProperties(&dictionary);
-  EXPECT_EQ(kTestIccid, *dictionary.FindStringKey(shill::kIccidProperty));
-  EXPECT_EQ(kTestEid, *dictionary.FindStringKey(shill::kEidProperty));
-  EXPECT_EQ(kTestGuid, *dictionary.FindStringKey(shill::kGuidProperty));
+  EXPECT_EQ(kTestIccid, *dictionary.FindString(shill::kIccidProperty));
+  EXPECT_EQ(kTestEid, *dictionary.FindString(shill::kEidProperty));
+  EXPECT_EQ(kTestGuid, *dictionary.FindString(shill::kGuidProperty));
 
   non_shill_cellular = NetworkState::CreateNonShillCellularNetwork(
       kTestIccid, kTestEid, kTestGuid, /*is_managed=*/true,
@@ -511,13 +508,13 @@
   EXPECT_TRUE(non_shill_cellular->IsManagedByPolicy());
 
   non_shill_cellular->GetStateProperties(&dictionary);
-  EXPECT_EQ(kTestIccid, *dictionary.FindStringKey(shill::kIccidProperty));
-  EXPECT_EQ(kTestEid, *dictionary.FindStringKey(shill::kEidProperty));
-  EXPECT_EQ(kTestGuid, *dictionary.FindStringKey(shill::kGuidProperty));
+  EXPECT_EQ(kTestIccid, *dictionary.FindString(shill::kIccidProperty));
+  EXPECT_EQ(kTestEid, *dictionary.FindString(shill::kEidProperty));
+  EXPECT_EQ(kTestGuid, *dictionary.FindString(shill::kGuidProperty));
 }
 
 TEST_F(NetworkStateTest, UpdateCaptivePortalState) {
-  base::Value shill_properties(base::Value::Type::DICT);
+  base::Value::Dict shill_properties;
 
   network_state_->set_visible(true);
   EXPECT_EQ(GetShillPortalState(), NetworkState::PortalState::kUnknown);
@@ -538,9 +535,8 @@
   UpdateCaptivePortalState(shill_properties);
   EXPECT_EQ(GetShillPortalState(), NetworkState::PortalState::kPortalSuspected);
 
-  shill_properties.GetDict().Set(
-      shill::kPortalDetectionFailedStatusCodeProperty,
-      net::HTTP_PROXY_AUTHENTICATION_REQUIRED);
+  shill_properties.Set(shill::kPortalDetectionFailedStatusCodeProperty,
+                       net::HTTP_PROXY_AUTHENTICATION_REQUIRED);
   UpdateCaptivePortalState(shill_properties);
   EXPECT_EQ(GetShillPortalState(),
             NetworkState::PortalState::kProxyAuthRequired);
diff --git a/chromeos/ash/components/network/network_util.cc b/chromeos/ash/components/network/network_util.cc
index 99fe947..e622115 100644
--- a/chromeos/ash/components/network/network_util.cc
+++ b/chromeos/ash/components/network/network_util.cc
@@ -215,7 +215,7 @@
 
 base::Value::Dict TranslateNetworkStateToONC(const NetworkState* network) {
   // Get the properties from the NetworkState.
-  base::Value shill_dictionary(base::Value::Type::DICT);
+  base::Value::Dict shill_dictionary;
   network->GetStateProperties(&shill_dictionary);
 
   // Get any Device properties required to translate state.
@@ -224,15 +224,14 @@
         NetworkHandler::Get()->network_state_handler()->GetDeviceState(
             network->device_path());
     if (device) {
-      base::Value device_dict(base::Value::Type::DICT);
+      base::Value::Dict device_dict;
       // We need to set Device.Cellular.ProviderRequiresRoaming so that
       // Cellular.RoamingState can be set correctly for badging network icons.
-      device_dict.SetKey(shill::kProviderRequiresRoamingProperty,
-                         base::Value(device->provider_requires_roaming()));
+      device_dict.Set(shill::kProviderRequiresRoamingProperty,
+                      device->provider_requires_roaming());
       // Scanning is also used in the UI when displaying a list of networks.
-      device_dict.SetKey(shill::kScanningProperty,
-                         base::Value(device->scanning()));
-      shill_dictionary.SetKey(shill::kDeviceProperty, std::move(device_dict));
+      device_dict.Set(shill::kScanningProperty, device->scanning());
+      shill_dictionary.Set(shill::kDeviceProperty, std::move(device_dict));
     }
   }
 
@@ -247,8 +246,8 @@
       ->FindPolicyByGUID(user_id_hash, network->guid(), &onc_source);
 
   base::Value::Dict onc_dictionary = onc::TranslateShillServiceToONCPart(
-      shill_dictionary.GetDict(), onc_source,
-      &chromeos::onc::kNetworkWithStateSignature, network);
+      shill_dictionary, onc_source, &chromeos::onc::kNetworkWithStateSignature,
+      network);
 
   // Remove IPAddressConfigType/NameServersConfigType as these were
   // historically not provided by TranslateNetworkStateToONC.
diff --git a/chromeos/ash/components/network/onc/network_onc_utils.cc b/chromeos/ash/components/network/onc/network_onc_utils.cc
index ef9c994..5291a1bd 100644
--- a/chromeos/ash/components/network/onc/network_onc_utils.cc
+++ b/chromeos/ash/components/network/onc/network_onc_utils.cc
@@ -367,7 +367,7 @@
   return NetworkTypePattern::Default();
 }
 
-base::Value::Dict ConvertOncProxySettingsToProxyConfig(
+absl::optional<base::Value::Dict> ConvertOncProxySettingsToProxyConfig(
     const base::Value::Dict& onc_proxy_settings) {
   std::string type = GetString(onc_proxy_settings, ::onc::proxy::kType);
 
@@ -388,7 +388,7 @@
         onc_proxy_settings.FindDict(::onc::proxy::kManual);
     if (!manual_dict) {
       NET_LOG(ERROR) << "Manual proxy missing dictionary";
-      return base::Value::Dict();
+      return absl::nullopt;
     }
     std::string manual_spec;
     AppendProxyServerForScheme(*manual_dict, ::onc::proxy::kFtp, &manual_spec);
@@ -407,10 +407,10 @@
                                                      bypass_rules.ToString());
   }
   NOTREACHED();
-  return base::Value::Dict();
+  return absl::nullopt;
 }
 
-base::Value ConvertProxyConfigToOncProxySettings(
+absl::optional<base::Value::Dict> ConvertProxyConfigToOncProxySettings(
     const base::Value::Dict& proxy_config_dict) {
   // Create a ProxyConfigDictionary from the dictionary.
   ProxyConfigDictionary proxy_config(proxy_config_dict.Clone());
@@ -418,8 +418,9 @@
   // Create the result Value and populate it.
   base::Value::Dict proxy_settings;
   ProxyPrefs::ProxyMode mode;
-  if (!proxy_config.GetMode(&mode))
-    return base::Value();
+  if (!proxy_config.GetMode(&mode)) {
+    return absl::nullopt;
+  }
   switch (mode) {
     case ProxyPrefs::MODE_DIRECT: {
       proxy_settings.Set(::onc::proxy::kType, ::onc::proxy::kDirect);
@@ -471,10 +472,10 @@
     }
     default: {
       LOG(ERROR) << "Unexpected proxy mode in Shill config: " << mode;
-      return base::Value();
+      return absl::nullopt;
     }
   }
-  return base::Value(std::move(proxy_settings));
+  return proxy_settings;
 }
 
 base::flat_map<std::string, std::string> GetVariableExpansionsForUser(
diff --git a/chromeos/ash/components/network/onc/network_onc_utils.h b/chromeos/ash/components/network/onc/network_onc_utils.h
index e3b45bfb..955a193c 100644
--- a/chromeos/ash/components/network/onc/network_onc_utils.h
+++ b/chromeos/ash/components/network/onc/network_onc_utils.h
@@ -17,6 +17,7 @@
 #include "chromeos/components/onc/variable_expander.h"
 #include "components/onc/onc_constants.h"
 #include "net/cert/scoped_nss_types.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 class PrefService;
 
@@ -41,13 +42,13 @@
 // Translates |onc_proxy_settings|, which must be a valid ONC ProxySettings
 // dictionary, to a ProxyConfig dictionary (see proxy_config_dictionary.h).
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-base::Value::Dict ConvertOncProxySettingsToProxyConfig(
+absl::optional<base::Value::Dict> ConvertOncProxySettingsToProxyConfig(
     const base::Value::Dict& onc_proxy_settings);
 
 // Translates |proxy_config_dict|, which must be a valid ProxyConfig dictionary
 // (see proxy_config_dictionary.h) to an ONC ProxySettings dictionary.
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-base::Value ConvertProxyConfigToOncProxySettings(
+absl::optional<base::Value::Dict> ConvertProxyConfigToOncProxySettings(
     const base::Value::Dict& proxy_config_dict);
 
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
@@ -60,7 +61,7 @@
                           const base::Value::List& network_configs,
                           std::string* error);
 
-// Convenvience function to retrieve the "AllowOnlyPolicyNetworksToAutoconnect"
+// Convenience function to retrieve the "AllowOnlyPolicyNetworksToAutoconnect"
 // setting from the global network configuration (see
 // GetGlobalConfigFromPolicy).
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
diff --git a/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc b/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc
index a349ba7..8f525bf 100644
--- a/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc
+++ b/chromeos/ash/components/network/onc/network_onc_utils_unittest.cc
@@ -48,8 +48,9 @@
         test_case_dict.FindDict("ONC_ProxySettings");
     ASSERT_TRUE(onc_proxy_settings);
 
-    base::Value::Dict actual_proxy_config =
+    absl::optional<base::Value::Dict> actual_proxy_config =
         ConvertOncProxySettingsToProxyConfig(*onc_proxy_settings);
+    ASSERT_TRUE(actual_proxy_config.has_value());
     EXPECT_EQ(*expected_proxy_config, actual_proxy_config);
   }
 }
@@ -67,13 +68,15 @@
         test_case_dict.FindDict("ProxyConfig");
     ASSERT_TRUE(shill_proxy_config);
 
-    const base::Value* onc_proxy_settings =
-        test_case_dict.Find("ONC_ProxySettings");
+    const base::Value::Dict* onc_proxy_settings =
+        test_case_dict.FindDict("ONC_ProxySettings");
     ASSERT_TRUE(onc_proxy_settings);
 
-    base::Value actual_proxy_settings =
+    absl::optional<base::Value::Dict> actual_proxy_settings =
         ConvertProxyConfigToOncProxySettings(*shill_proxy_config);
-    EXPECT_TRUE(test_utils::Equals(onc_proxy_settings, &actual_proxy_settings));
+    ASSERT_TRUE(actual_proxy_settings.has_value());
+    EXPECT_TRUE(
+        test_utils::Equals(onc_proxy_settings, &actual_proxy_settings.value()));
   }
 }
 
diff --git a/chromeos/ash/components/network/onc/onc_certificate_pattern_unittest.cc b/chromeos/ash/components/network/onc/onc_certificate_pattern_unittest.cc
index 119c51e..0afc1be 100644
--- a/chromeos/ash/components/network/onc/onc_certificate_pattern_unittest.cc
+++ b/chromeos/ash/components/network/onc/onc_certificate_pattern_unittest.cc
@@ -113,10 +113,9 @@
   }
 
   {
-    base::Value* issuer =
-        parsed_json->FindKeyOfType("Issuer", base::Value::Type::DICT);
+    base::Value::Dict* issuer = parsed_json->GetDict().FindDict("Issuer");
     ASSERT_TRUE(issuer);
-    issuer->SetKey("CommonName", base::Value("SomeOtherCA"));
+    issuer->Set("CommonName", "SomeOtherCA");
 
     auto pattern =
         OncCertificatePattern::ReadFromONCDictionary(parsed_json->GetDict());
@@ -149,10 +148,9 @@
   }
 
   {
-    base::Value* issuer =
-        parsed_json->FindKeyOfType("Subject", base::Value::Type::DICT);
+    base::Value::Dict* issuer = parsed_json->GetDict().FindDict("Subject");
     ASSERT_TRUE(issuer);
-    issuer->SetKey("CommonName", base::Value("B CA"));
+    issuer->Set("CommonName", "B CA");
 
     auto pattern =
         OncCertificatePattern::ReadFromONCDictionary(parsed_json->GetDict());
diff --git a/chromeos/ash/components/network/onc/onc_translator_onc_to_shill.cc b/chromeos/ash/components/network/onc/onc_translator_onc_to_shill.cc
index 45543d1..3ab9aee1 100644
--- a/chromeos/ash/components/network/onc/onc_translator_onc_to_shill.cc
+++ b/chromeos/ash/components/network/onc/onc_translator_onc_to_shill.cc
@@ -482,7 +482,8 @@
       onc_object_->FindDict(::onc::network_config::kProxySettings);
   if (proxy_settings) {
     base::Value::Dict proxy_config =
-        ConvertOncProxySettingsToProxyConfig(*proxy_settings);
+        ConvertOncProxySettingsToProxyConfig(*proxy_settings)
+            .value_or(base::Value::Dict());
     std::string proxy_config_str;
     base::JSONWriter::Write(proxy_config, &proxy_config_str);
     shill_dictionary_->Set(shill::kProxyConfigProperty, proxy_config_str);
diff --git a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc
index 47d9af0..13ff3a13 100644
--- a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc
+++ b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc
@@ -768,11 +768,11 @@
     absl::optional<base::Value::Dict> proxy_config =
         chromeos::onc::ReadDictionaryFromJson(*proxy_config_str);
     if (proxy_config.has_value()) {
-      base::Value proxy_settings =
-          ConvertProxyConfigToOncProxySettings(*proxy_config);
-      if (!proxy_settings.is_none()) {
+      absl::optional<base::Value::Dict> proxy_settings =
+          ConvertProxyConfigToOncProxySettings(proxy_config.value());
+      if (proxy_settings) {
         onc_object_.Set(::onc::network_config::kProxySettings,
-                        std::move(proxy_settings));
+                        std::move(proxy_settings.value()));
       }
     }
   }
diff --git a/chromeos/ash/components/network/profile_policies.h b/chromeos/ash/components/network/profile_policies.h
index 65b7047..5e4a4e4 100644
--- a/chromeos/ash/components/network/profile_policies.h
+++ b/chromeos/ash/components/network/profile_policies.h
@@ -145,9 +145,7 @@
 
   // Returns the GlobalNetworkConfiguration ONC Dictionary.
   // This will never return nullptr (if no GlobalNetworkConfiguration has been
-  // set, it will return a pointer to an empty DICT base::Value). It returns a
-  // pointer for convenience at the call sites, which work with base::Value* to
-  // be consistent with GetPolicyByGuid return values.
+  // set, it will return a pointer to an empty dictionary).
   // The returned pointer remains valid as long as this instance is valid and is
   // not modified (e.g. by calls to SetGlobalNetworkConfig).
   const base::Value::Dict* GetGlobalNetworkConfig() const {
diff --git a/chromeos/ash/components/network/proxy/proxy_config_handler.cc b/chromeos/ash/components/network/proxy/proxy_config_handler.cc
index 299997a..5ac580d 100644
--- a/chromeos/ash/components/network/proxy/proxy_config_handler.cc
+++ b/chromeos/ash/components/network/proxy/proxy_config_handler.cc
@@ -59,7 +59,8 @@
     }
 
     return std::make_unique<ProxyConfigDictionary>(
-        onc::ConvertOncProxySettingsToProxyConfig(*proxy_policy));
+        onc::ConvertOncProxySettingsToProxyConfig(*proxy_policy)
+            .value_or(base::Value::Dict()));
   }
 
   if (network.profile_path().empty())
@@ -85,10 +86,11 @@
   // unshared) configuration.
   // The user's proxy setting is not stored in the Chrome preference yet. We
   // still rely on Shill storing it.
-  const base::Value& value = network.proxy_config();
-  if (value.is_none())
+  const absl::optional<base::Value::Dict>& value = network.proxy_config();
+  if (!value) {
     return nullptr;
-  return std::make_unique<ProxyConfigDictionary>(value.GetDict().Clone());
+  }
+  return std::make_unique<ProxyConfigDictionary>(value.value().Clone());
 }
 
 void SetProxyConfigForNetwork(const ProxyConfigDictionary& proxy_config,
diff --git a/chromeos/ash/components/network/shill_property_handler.cc b/chromeos/ash/components/network/shill_property_handler.cc
index c685ce0..43b80210 100644
--- a/chromeos/ash/components/network/shill_property_handler.cc
+++ b/chromeos/ash/components/network/shill_property_handler.cc
@@ -392,8 +392,9 @@
                                                   const base::Value& value) {
   if (key == shill::kDefaultServiceProperty) {
     std::string service_path;
-    if (value.is_string())
+    if (value.is_string()) {
       service_path = value.GetString();
+    }
     NET_LOG(EVENT) << "Manager.DefaultService = "
                    << NetworkPathId(service_path);
     listener_->DefaultNetworkServiceChanged(service_path);
@@ -415,23 +416,33 @@
       UpdateObserved(ManagedState::MANAGED_TYPE_DEVICE, value);
     }
   } else if (key == shill::kAvailableTechnologiesProperty) {
-    if (CheckListValue(key, value))
+    if (CheckListValue(key, value)) {
       UpdateAvailableTechnologies(value);
+    }
   } else if (key == shill::kEnabledTechnologiesProperty) {
-    if (CheckListValue(key, value))
+    if (CheckListValue(key, value)) {
       UpdateEnabledTechnologies(value);
+    }
   } else if (key == shill::kUninitializedTechnologiesProperty) {
-    if (CheckListValue(key, value))
+    if (CheckListValue(key, value)) {
       UpdateUninitializedTechnologies(value);
-  } else if (key == shill::kProhibitedTechnologiesProperty &&
-             value.is_string()) {
-    UpdateProhibitedTechnologies(value.GetString());
+    }
+  } else if (key == shill::kProhibitedTechnologiesProperty) {
+    if (value.is_string()) {
+      UpdateProhibitedTechnologies(value.GetString());
+    }
   } else if (key == shill::kProfilesProperty) {
-    listener_->ProfileListChanged(value);
-  } else if (key == shill::kCheckPortalListProperty && value.is_string()) {
-    listener_->CheckPortalListChanged(value.GetString());
-  } else if (key == shill::kDhcpPropertyHostnameProperty && value.is_string()) {
-    listener_->HostnameChanged(value.GetString());
+    if (value.is_list()) {
+      listener_->ProfileListChanged(value.GetList());
+    }
+  } else if (key == shill::kCheckPortalListProperty) {
+    if (value.is_string()) {
+      listener_->CheckPortalListChanged(value.GetString());
+    }
+  } else if (key == shill::kDhcpPropertyHostnameProperty) {
+    if (value.is_string()) {
+      listener_->HostnameChanged(value.GetString());
+    }
   } else {
     VLOG(2) << "Ignored Manager Property: " << key;
   }
diff --git a/chromeos/ash/components/network/shill_property_handler.h b/chromeos/ash/components/network/shill_property_handler.h
index d946e691..866e28650 100644
--- a/chromeos/ash/components/network/shill_property_handler.h
+++ b/chromeos/ash/components/network/shill_property_handler.h
@@ -56,7 +56,7 @@
         const base::Value::Dict& properties) = 0;
 
     // Called when the list of profiles changes.
-    virtual void ProfileListChanged(const base::Value& profile_list) = 0;
+    virtual void ProfileListChanged(const base::Value::List& profile_list) = 0;
 
     // Called when a property for a watched network service has changed.
     virtual void UpdateNetworkServiceProperty(const std::string& service_path,
diff --git a/chromeos/ash/components/network/shill_property_handler_unittest.cc b/chromeos/ash/components/network/shill_property_handler_unittest.cc
index 27aec2f..e1b4034 100644
--- a/chromeos/ash/components/network/shill_property_handler_unittest.cc
+++ b/chromeos/ash/components/network/shill_property_handler_unittest.cc
@@ -65,11 +65,8 @@
     initial_property_updates(GetTypeString(type))[path] += 1;
   }
 
-  void ProfileListChanged(const base::Value& profile_list) override {
-    if (!profile_list.is_list()) {
-      return;
-    }
-    profile_list_size_ = profile_list.GetList().size();
+  void ProfileListChanged(const base::Value::List& profile_list) override {
+    profile_list_size_ = profile_list.size();
   }
 
   void UpdateNetworkServiceProperty(const std::string& service_path,
diff --git a/chromeos/ash/components/phonehub/cros_state_sender.cc b/chromeos/ash/components/phonehub/cros_state_sender.cc
index a4f107e..2992659 100644
--- a/chromeos/ash/components/phonehub/cros_state_sender.cc
+++ b/chromeos/ash/components/phonehub/cros_state_sender.cc
@@ -113,6 +113,7 @@
     bool is_valid) {
   if (!is_valid) {
     SendCrosStateMessage(/*attestation_certs=*/nullptr);
+    return;
   }
 
   SendCrosStateMessage(std::move(&attestation_certs));
diff --git a/chromeos/ash/components/tether/wifi_hotspot_connector_unittest.cc b/chromeos/ash/components/tether/wifi_hotspot_connector_unittest.cc
index 822c168..af8a2df9 100644
--- a/chromeos/ash/components/tether/wifi_hotspot_connector_unittest.cc
+++ b/chromeos/ash/components/tether/wifi_hotspot_connector_unittest.cc
@@ -207,7 +207,7 @@
     void ShowPortalSignin(const std::string& service_path,
                           NetworkConnect::Source source) override {}
     void ConfigureNetworkIdAndConnect(const std::string& network_id,
-                                      const base::Value& shill_properties,
+                                      const base::Value::Dict& shill_properties,
                                       bool shared) override {}
     void CreateConfigurationAndConnect(base::Value::Dict shill_properties,
                                        bool shared) override {}
diff --git a/chromeos/ash/services/bluetooth_config/device_cache_impl.cc b/chromeos/ash/services/bluetooth_config/device_cache_impl.cc
index d12fe91..829aa9a3 100644
--- a/chromeos/ash/services/bluetooth_config/device_cache_impl.cc
+++ b/chromeos/ash/services/bluetooth_config/device_cache_impl.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 
+#include "ash/constants/ash_features.h"
 #include "base/containers/contains.h"
 #include "chromeos/ash/services/bluetooth_config/device_conversion_util.h"
 #include "components/device_event_log/device_event_log.h"
@@ -166,6 +167,12 @@
     if (device->GetIdentifier() != device_id)
       continue;
 
+    if (ash::features::IsFastPairSavedDevicesNicknamesEnabled() &&
+        fast_pair_delegate_ && nickname.has_value()) {
+      fast_pair_delegate_->UpdateDeviceNickname(device->GetAddress(),
+                                                nickname.value());
+    }
+
     DeviceChanged(bluetooth_adapter_.get(), device);
     return;
   }
diff --git a/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
index 71c3e7f..283a85a8 100644
--- a/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
+++ b/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
@@ -182,6 +182,10 @@
     fake_device_name_manager_.SetDeviceNickname(device_id, nickname);
   }
 
+  absl::optional<std::string> GetDeviceNickname(std::string address) {
+    return fake_fast_pair_delegate_.GetDeviceNickname(address);
+  }
+
   void ForgetDevice(const std::string& device_id) {
     // Simulates the real-life behavior of when a device is forgotten.
     auto it = FindDevice(device_id);
@@ -446,6 +450,14 @@
   SetDeviceNickname(paired_device_id, kTestBluetoothNickname);
   EXPECT_EQ(2u, GetNumPairedDeviceListObserverEvents());
   list = GetPairedDevices();
+
+  // In this test file, AddDevice() uses |num_devices_created_| converted to a
+  // string  as the address for each device. Only one device is created in this
+  // test so "0" is the address of the device we want to check.
+  auto nickname = GetDeviceNickname("0");
+
+  EXPECT_TRUE(nickname.has_value());
+  EXPECT_TRUE(nickname.value() == kTestBluetoothNickname);
   EXPECT_EQ(1u, list.size());
   EXPECT_EQ(paired_device_id, list[0]->device_properties->id);
   EXPECT_EQ(kTestBluetoothNickname, list[0]->nickname);
diff --git a/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.cc b/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.cc
index 7585504..4007402 100644
--- a/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.cc
+++ b/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.cc
@@ -20,6 +20,11 @@
   adapter_state_controller_ = adapter_state_controller;
 }
 
+void FakeFastPairDelegate::UpdateDeviceNickname(const std::string& mac_address,
+                                                const std::string& nickname) {
+  mac_address_to_nickname_.insert_or_assign(mac_address, nickname);
+}
+
 void FakeFastPairDelegate::SetDeviceNameManager(
     DeviceNameManager* device_name_manager) {
   device_name_manager_ = device_name_manager;
diff --git a/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.h b/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.h
index 581d83b..049ba4e 100644
--- a/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.h
+++ b/chromeos/ash/services/bluetooth_config/fake_fast_pair_delegate.h
@@ -33,16 +33,28 @@
     return forgotten_device_addresses_;
   }
 
+  absl::optional<std::string> GetDeviceNickname(
+      const std::string& mac_address) {
+    const auto it = mac_address_to_nickname_.find(mac_address);
+    if (it == mac_address_to_nickname_.end()) {
+      return absl::nullopt;
+    }
+    return it->second;
+  }
+
   // FastPairDelegate:
   absl::optional<DeviceImageInfo> GetDeviceImageInfo(
       const std::string& mac_address) override;
   void ForgetDevice(const std::string& mac_address) override;
   void SetAdapterStateController(
       AdapterStateController* adapter_state_controller) override;
+  void UpdateDeviceNickname(const std::string& mac_address,
+                            const std::string& nickname) override;
   void SetDeviceNameManager(DeviceNameManager* device_name_manager) override;
 
  private:
   base::flat_map<std::string, DeviceImageInfo> mac_address_to_images_;
+  base::flat_map<std::string, std::string> mac_address_to_nickname_;
   std::vector<std::string> forgotten_device_addresses_;
   AdapterStateController* adapter_state_controller_ = nullptr;
   DeviceNameManager* device_name_manager_ = nullptr;
diff --git a/chromeos/ash/services/bluetooth_config/fast_pair_delegate.h b/chromeos/ash/services/bluetooth_config/fast_pair_delegate.h
index 2d72d74..72ad3d8b 100644
--- a/chromeos/ash/services/bluetooth_config/fast_pair_delegate.h
+++ b/chromeos/ash/services/bluetooth_config/fast_pair_delegate.h
@@ -23,6 +23,8 @@
   virtual absl::optional<DeviceImageInfo> GetDeviceImageInfo(
       const std::string& mac_address) = 0;
   virtual void ForgetDevice(const std::string& mac_address) = 0;
+  virtual void UpdateDeviceNickname(const std::string& mac_address,
+                                    const std::string& nickname) = 0;
   virtual void SetAdapterStateController(
       AdapterStateController* adapter_state_controller) = 0;
   virtual void SetDeviceNameManager(DeviceNameManager* device_name_manager) = 0;
diff --git a/chromeos/ash/services/hotspot_config/BUILD.gn b/chromeos/ash/services/hotspot_config/BUILD.gn
index de155fc..c090505 100644
--- a/chromeos/ash/services/hotspot_config/BUILD.gn
+++ b/chromeos/ash/services/hotspot_config/BUILD.gn
@@ -16,6 +16,7 @@
     "//base",
     "//chromeos/ash/components/dbus/shill",
     "//chromeos/ash/components/network",
+    "//chromeos/ash/services/hotspot_config/public/cpp",
     "//chromeos/ash/services/hotspot_config/public/mojom",
   ]
 }
diff --git a/chromeos/ash/services/hotspot_config/cros_hotspot_config.cc b/chromeos/ash/services/hotspot_config/cros_hotspot_config.cc
index 31fc105..b44fa83 100644
--- a/chromeos/ash/services/hotspot_config/cros_hotspot_config.cc
+++ b/chromeos/ash/services/hotspot_config/cros_hotspot_config.cc
@@ -92,4 +92,9 @@
     observer->OnHotspotInfoChanged();
 }
 
+void CrosHotspotConfig::ObserveEnabledStateChanges(
+    mojo::PendingRemote<mojom::HotspotEnabledStateObserver> observer) {
+  hotspot_controller_->ObserveEnabledStateChanges(std::move(observer));
+}
+
 }  // namespace ash::hotspot_config
diff --git a/chromeos/ash/services/hotspot_config/cros_hotspot_config.h b/chromeos/ash/services/hotspot_config/cros_hotspot_config.h
index 37fd682..038b7f39 100644
--- a/chromeos/ash/services/hotspot_config/cros_hotspot_config.h
+++ b/chromeos/ash/services/hotspot_config/cros_hotspot_config.h
@@ -39,6 +39,9 @@
       mojo::PendingReceiver<mojom::CrosHotspotConfig> pending_receiver);
 
   // mojom::CrosHotspotConfig
+  void ObserveEnabledStateChanges(
+      mojo::PendingRemote<mojom::HotspotEnabledStateObserver> observer)
+      override;
   void AddObserver(
       mojo::PendingRemote<mojom::CrosHotspotConfigObserver> observer) override;
   void GetHotspotInfo(GetHotspotInfoCallback callback) override;
diff --git a/chromeos/ash/services/hotspot_config/cros_hotspot_config_unittest.cc b/chromeos/ash/services/hotspot_config/cros_hotspot_config_unittest.cc
index 604d243..1ab3f5b 100644
--- a/chromeos/ash/services/hotspot_config/cros_hotspot_config_unittest.cc
+++ b/chromeos/ash/services/hotspot_config/cros_hotspot_config_unittest.cc
@@ -13,6 +13,7 @@
 #include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_handler_test_helper.h"
 #include "chromeos/ash/services/hotspot_config/public/cpp/cros_hotspot_config_test_observer.h"
+#include "chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
@@ -74,6 +75,11 @@
   void SetupObserver() {
     observer_ = std::make_unique<CrosHotspotConfigTestObserver>();
     cros_hotspot_config_->AddObserver(observer_->GenerateRemote());
+
+    hotspot_enabled_state_observer_ =
+        std::make_unique<HotspotEnabledStateTestObserver>();
+    cros_hotspot_config_->ObserveEnabledStateChanges(
+        hotspot_enabled_state_observer_->GenerateRemote());
   }
 
   void SetValidHotspotCapabilities() {
@@ -185,12 +191,18 @@
 
   CrosHotspotConfigTestObserver* observer() { return observer_.get(); }
 
+  HotspotEnabledStateTestObserver* hotspotStateObserver() {
+    return hotspot_enabled_state_observer_.get();
+  }
+
  private:
   base::test::SingleThreadTaskEnvironment task_environment_;
   base::test::ScopedFeatureList feature_list_;
   std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_;
   std::unique_ptr<CrosHotspotConfig> cros_hotspot_config_;
   std::unique_ptr<CrosHotspotConfigTestObserver> observer_;
+  std::unique_ptr<HotspotEnabledStateTestObserver>
+      hotspot_enabled_state_observer_;
 };
 
 TEST_F(CrosHotspotConfigTest, GetHotspotInfo) {
@@ -256,6 +268,7 @@
 }
 
 TEST_F(CrosHotspotConfigTest, EnableHotspot) {
+  SetupObserver();
   EXPECT_EQ(mojom::HotspotControlResult::kNotAllowed, EnableHotspot());
 
   SetReadinessCheckResultReady();
@@ -266,6 +279,7 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(mojom::HotspotControlResult::kSuccess, EnableHotspot());
+  EXPECT_EQ(hotspotStateObserver()->hotspot_turned_on_count(), 1u);
 
   // Simulate check tethering readiness operation fail.
   helper()->manager_test()->SetSimulateCheckTetheringReadinessResult(
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/BUILD.gn b/chromeos/ash/services/hotspot_config/public/cpp/BUILD.gn
index 10bb948..c734f4b 100644
--- a/chromeos/ash/services/hotspot_config/public/cpp/BUILD.gn
+++ b/chromeos/ash/services/hotspot_config/public/cpp/BUILD.gn
@@ -10,6 +10,8 @@
   sources = [
     "cros_hotspot_config_observer.cc",
     "cros_hotspot_config_observer.h",
+    "hotspot_enabled_state_provider.cc",
+    "hotspot_enabled_state_provider.h",
   ]
 
   deps = [ "//chromeos/ash/services/hotspot_config/public/mojom" ]
@@ -21,6 +23,8 @@
   sources = [
     "cros_hotspot_config_test_observer.cc",
     "cros_hotspot_config_test_observer.h",
+    "hotspot_enabled_state_test_observer.cc",
+    "hotspot_enabled_state_test_observer.h",
   ]
 
   public_deps = [
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.cc b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.cc
new file mode 100644
index 0000000..5e7c3ae
--- /dev/null
+++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.cc
@@ -0,0 +1,24 @@
+// 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 "chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.h"
+
+namespace ash::hotspot_config {
+
+HotspotEnabledStateProvider::HotspotEnabledStateProvider() = default;
+
+HotspotEnabledStateProvider::~HotspotEnabledStateProvider() = default;
+
+void HotspotEnabledStateProvider::ObserveEnabledStateChanges(
+    mojo::PendingRemote<mojom::HotspotEnabledStateObserver> observer) {
+  observers_.Add(std::move(observer));
+}
+
+void HotspotEnabledStateProvider::NotifyHotspotTurnedOn(bool wifi_turned_off) {
+  for (auto& observer : observers_) {
+    observer->OnHotspotTurnedOn(wifi_turned_off);
+  }
+}
+
+}  // namespace ash::hotspot_config
\ No newline at end of file
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.h b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.h
new file mode 100644
index 0000000..1eb01e4
--- /dev/null
+++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_provider.h
@@ -0,0 +1,38 @@
+// 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 CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_PUBLIC_CPP_HOTSPOT_ENABLED_STATE_PROVIDER_H_
+#define CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_PUBLIC_CPP_HOTSPOT_ENABLED_STATE_PROVIDER_H_
+
+#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
+
+namespace ash::hotspot_config {
+
+// Notifies observers about changes to following hotspot states: turned on and
+// turned off. Hotspot turned on notification is delivered when the user
+// explicitly turns on the hotspot and turned off notification is delivered when
+// the system disables the hotspot.
+class HotspotEnabledStateProvider {
+ public:
+  virtual ~HotspotEnabledStateProvider();
+
+  // Adds an observer to a list of observers who will be notified when hotspot
+  // is turned on or off.
+  void ObserveEnabledStateChanges(
+      mojo::PendingRemote<mojom::HotspotEnabledStateObserver> observer);
+
+ protected:
+  HotspotEnabledStateProvider();
+
+  void NotifyHotspotTurnedOn(bool wifi_turned_off);
+
+ private:
+  mojo::RemoteSet<mojom::HotspotEnabledStateObserver> observers_;
+};
+
+}  // namespace ash::hotspot_config
+
+#endif
\ No newline at end of file
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc
new file mode 100644
index 0000000..276f741f
--- /dev/null
+++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc
@@ -0,0 +1,21 @@
+// 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 "chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h"
+
+namespace ash::hotspot_config {
+
+HotspotEnabledStateTestObserver::HotspotEnabledStateTestObserver() = default;
+HotspotEnabledStateTestObserver::~HotspotEnabledStateTestObserver() = default;
+
+mojo::PendingRemote<mojom::HotspotEnabledStateObserver>
+HotspotEnabledStateTestObserver::GenerateRemote() {
+  return receiver().BindNewPipeAndPassRemote();
+}
+
+void HotspotEnabledStateTestObserver::OnHotspotTurnedOn(bool wifi_turned_off) {
+  hotspot_turned_on_count_++;
+}
+
+}  // namespace ash::hotspot_config
\ No newline at end of file
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h
new file mode 100644
index 0000000..be295ebe
--- /dev/null
+++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h
@@ -0,0 +1,45 @@
+// 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 CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_PUBLIC_CPP_HOTSPOT_ENABLED_STATE_TEST_OBSERVER_H_
+#define CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_PUBLIC_CPP_HOTSPOT_ENABLED_STATE_TEST_OBSERVER_H_
+
+#include "base/sequence_checker.h"
+#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+namespace ash::hotspot_config {
+
+class HotspotEnabledStateTestObserver
+    : public mojom::HotspotEnabledStateObserver {
+ public:
+  HotspotEnabledStateTestObserver();
+
+  HotspotEnabledStateTestObserver(const HotspotEnabledStateTestObserver&) =
+      delete;
+  HotspotEnabledStateTestObserver& operator=(
+      const HotspotEnabledStateTestObserver&) = delete;
+
+  ~HotspotEnabledStateTestObserver() override;
+
+  mojo::PendingRemote<mojom::HotspotEnabledStateObserver> GenerateRemote();
+
+  // mojom::HotspotEnabledStateObserver:
+  void OnHotspotTurnedOn(bool wifi_turned_off) override;
+
+  size_t hotspot_turned_on_count() const { return hotspot_turned_on_count_; }
+
+  mojo::Receiver<mojom::HotspotEnabledStateObserver>& receiver() {
+    return receiver_;
+  }
+
+ private:
+  mojo::Receiver<mojom::HotspotEnabledStateObserver> receiver_{this};
+  size_t hotspot_turned_on_count_ = 0;
+};
+
+}  // namespace ash::hotspot_config
+
+#endif  // CHROMEOS_ASH_SERVICES_HOTSPOT_CONFIG_PUBLIC_CPP_HOTSPOT_ENABLED_STATE_TEST_OBSERVER_H_
diff --git a/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom b/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom
index 90aa161..23e9d32 100644
--- a/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom
+++ b/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom
@@ -120,6 +120,10 @@
   // Adds an observer that can listen to hotspot related events.
   AddObserver(pending_remote<CrosHotspotConfigObserver> observer);
 
+  // Adds an observer to listen to hotspot turned on/off events.
+  ObserveEnabledStateChanges(
+    pending_remote<HotspotEnabledStateObserver> observer);
+
   // Returns HotspotInfo structure containing state, client count, capabilities,
   // supported security modes and configuration properties of Hotspot.
   GetHotspotInfo() => (HotspotInfo hotspot_info);
@@ -142,3 +146,11 @@
   // change within Hotspot.
   OnHotspotInfoChanged();
 };
+
+// HotspotEnabledStateObserver is implemented by any module that needs
+// to observe changes to the hotspot enabled state.
+interface HotspotEnabledStateObserver {
+  // Called when Hotspot is successfully turned on. `wifi_turned_off`
+  // indicates that WiFi was disabled in order to turn on Hotspot.
+  OnHotspotTurnedOn(bool wifi_turned_off);
+};
diff --git a/chromeos/ash/services/recording/webm_encoder_muxer.cc b/chromeos/ash/services/recording/webm_encoder_muxer.cc
index f95e48aa..eecf72b 100644
--- a/chromeos/ash/services/recording/webm_encoder_muxer.cc
+++ b/chromeos/ash/services/recording/webm_encoder_muxer.cc
@@ -308,7 +308,7 @@
   encoded_video_params_.push(EncodedVideoFrameParams{
       *frame->metadata().reference_time, frame->visible_rect().size()});
   video_encoder_->Encode(
-      std::move(frame), /*key_frame=*/false,
+      std::move(frame), media::VideoEncoder::EncodeOptions(/*key_frame=*/false),
       base::BindOnce(&WebmEncoderMuxer::OnEncoderStatus,
                      weak_ptr_factory_.GetWeakPtr(), /*for_video=*/true));
 }
diff --git a/chromeos/components/onc/onc_mapper.h b/chromeos/components/onc/onc_mapper.h
index 03e3fd5..fe2aba8f 100644
--- a/chromeos/components/onc/onc_mapper.h
+++ b/chromeos/components/onc/onc_mapper.h
@@ -11,8 +11,7 @@
 #include "base/component_export.h"
 #include "base/values.h"
 
-namespace chromeos {
-namespace onc {
+namespace chromeos::onc {
 
 struct OncValueSignature;
 
@@ -65,7 +64,7 @@
   // Adds the mapping of each field to |result| using |MapField| and drops
   // unknown fields by default. Sets |found_unknown_field| to true if this
   // dictionary contains any unknown fields. Set |nested_error| to true only if
-  // nested errors occured.
+  // nested errors occurred.
   virtual void MapFields(const OncValueSignature& object_signature,
                          const base::Value::Dict& onc_object,
                          bool* found_unknown_field,
@@ -100,7 +99,6 @@
                                bool* error);
 };
 
-}  // namespace onc
-}  // namespace chromeos
+}  // namespace chromeos::onc
 
 #endif  // CHROMEOS_COMPONENTS_ONC_ONC_MAPPER_H_
diff --git a/chromeos/components/onc/onc_test_utils.cc b/chromeos/components/onc/onc_test_utils.cc
index 34ece7f..d1d99ca 100644
--- a/chromeos/components/onc/onc_test_utils.cc
+++ b/chromeos/components/onc/onc_test_utils.cc
@@ -57,6 +57,8 @@
   return result;
 }
 
+namespace {
+
 base::Value ReadTestJson(const std::string& filename) {
   base::FilePath path;
   if (!GetTestDataPath(filename, &path)) {
@@ -74,14 +76,7 @@
   return std::move(*result);
 }
 
-base::Value ReadTestDictionaryValue(const std::string& filename) {
-  base::Value content = ReadTestJson(filename);
-  CHECK(content.is_dict())
-      << "File '" << filename
-      << "' does not contain a dictionary as expected, but type "
-      << content.type();
-  return content;
-}
+}  // namespace
 
 base::Value::Dict ReadTestDictionary(const std::string& filename) {
   base::Value content = ReadTestJson(filename);
@@ -100,21 +95,6 @@
   return std::move(content.GetList());
 }
 
-::testing::AssertionResult Equals(const base::Value* expected,
-                                  const base::Value* actual) {
-  CHECK(expected != nullptr);
-  if (actual == nullptr)
-    return ::testing::AssertionFailure() << "Actual value pointer is nullptr";
-
-  if (*expected == *actual)
-    return ::testing::AssertionSuccess() << "Values are equal";
-
-  return ::testing::AssertionFailure() << "Values are unequal.\n"
-                                       << "Expected value:\n"
-                                       << *expected << "Actual value:\n"
-                                       << *actual;
-}
-
 ::testing::AssertionResult Equals(const base::Value::Dict* expected,
                                   const base::Value::Dict* actual) {
   CHECK(expected != nullptr);
diff --git a/chromeos/components/onc/onc_test_utils.h b/chromeos/components/onc/onc_test_utils.h
index f6d8e7a..bc987d9 100644
--- a/chromeos/components/onc/onc_test_utils.h
+++ b/chromeos/components/onc/onc_test_utils.h
@@ -16,14 +16,6 @@
 // Read the file at |filename| as a string. CHECKs if any error occurs.
 std::string ReadTestData(const std::string& filename);
 
-// Read a JSON from |filename| and return it as a base::Value.
-// CHECKs if any error occurs.
-base::Value ReadTestJson(const std::string& filename);
-
-// Read a JSON dictionary from |filename| and return it as a base::Value.
-// CHECKs if any error occurs. TODO(crbug.com/1412465): REMOVE
-base::Value ReadTestDictionaryValue(const std::string& filename);
-
 // Read a JSON dictionary from |filename| and return it as a base::Value::Dict.
 // CHECKs if any error occurs.
 base::Value::Dict ReadTestDictionary(const std::string& filename);
@@ -35,8 +27,6 @@
 // Checks that the pointer |actual| is not NULL but points to a value that
 // equals |expected|. The intended use case is:
 // EXPECT_TRUE(test_utils::Equals(expected, actual));
-::testing::AssertionResult Equals(const base::Value* expected,
-                                  const base::Value* actual);
 ::testing::AssertionResult Equals(const base::Value::Dict* expected,
                                   const base::Value::Dict* actual);
 
diff --git a/chromeos/components/onc/onc_utils.cc b/chromeos/components/onc/onc_utils.cc
index ee9d72a7..81e4492 100644
--- a/chromeos/components/onc/onc_utils.cc
+++ b/chromeos/components/onc/onc_utils.cc
@@ -25,28 +25,30 @@
 #include "net/cert/pem.h"
 #include "net/cert/x509_certificate.h"
 
-namespace chromeos {
-namespace onc {
+namespace chromeos::onc {
 namespace {
 
 // Error messages that can be reported when decrypting encrypted ONC.
 constexpr char kUnableToDecrypt[] = "Unable to decrypt encrypted ONC";
 constexpr char kUnableToDecode[] = "Unable to decode encrypted ONC";
 
-bool GetString(const base::Value& dict, const char* key, std::string* result) {
-  const base::Value* value = dict.FindKeyOfType(key, base::Value::Type::STRING);
-  if (!value)
+bool GetString(const base::Value::Dict& dict,
+               const char* key,
+               std::string* result) {
+  const std::string* value = dict.FindString(key);
+  if (!value) {
     return false;
-  *result = value->GetString();
+  }
+  *result = *value;
   return true;
 }
 
-bool GetInt(const base::Value& dict, const char* key, int* result) {
-  const base::Value* value =
-      dict.FindKeyOfType(key, base::Value::Type::INTEGER);
-  if (!value)
+bool GetInt(const base::Value::Dict& dict, const char* key, int* result) {
+  const absl::optional<int> value = dict.FindInt(key);
+  if (!value) {
     return false;
-  *result = value->GetInt();
+  }
+  *result = value.value();
   return true;
 }
 
@@ -56,8 +58,9 @@
                  const VariableExpander& variable_expander,
                  base::Value::Dict* onc_object) {
   std::string* field_value = onc_object->FindString(fieldname);
-  if (!field_value)
+  if (!field_value) {
     return;
+  }
   variable_expander.ExpandString(field_value);
 }
 
@@ -126,26 +129,25 @@
 CertPEMsByGUIDMap GetServerAndCACertsByGUID(
     const base::Value::List& certificates) {
   CertPEMsByGUIDMap certs_by_guid;
-  for (const auto& cert : certificates) {
-    DCHECK(cert.is_dict());
+  for (const auto& cert_value : certificates) {
+    const base::Value::Dict& cert = cert_value.GetDict();
 
-    const std::string* guid = cert.FindStringKey(::onc::certificate::kGUID);
+    const std::string* guid = cert.FindString(::onc::certificate::kGUID);
     if (!guid || guid->empty()) {
       NET_LOG(ERROR) << "Certificate with missing or empty GUID.";
       continue;
     }
-    const std::string* cert_type =
-        cert.FindStringKey(::onc::certificate::kType);
+    const std::string* cert_type = cert.FindString(::onc::certificate::kType);
     DCHECK(cert_type);
     if (*cert_type != ::onc::certificate::kServer &&
         *cert_type != ::onc::certificate::kAuthority) {
       continue;
     }
-    const std::string* x509_data =
-        cert.FindStringKey(::onc::certificate::kX509);
+    const std::string* x509_data = cert.FindString(::onc::certificate::kX509);
     std::string der;
-    if (x509_data)
+    if (x509_data) {
       der = DecodePEM(*x509_data);
+    }
     std::string pem;
     if (der.empty() || !net::X509Certificate::GetPEMEncodedFromDER(der, &pem)) {
       NET_LOG(ERROR) << "Certificate not PEM encoded, GUID: " << *guid;
@@ -202,17 +204,19 @@
 bool ResolveSingleCertRef(const CertPEMsByGUIDMap& certs_by_guid,
                           const std::string& key_guid_ref,
                           const std::string& key_pem,
-                          base::Value* onc_object) {
-  std::string* guid_ref = onc_object->FindStringKey(key_guid_ref);
-  if (!guid_ref)
+                          base::Value::Dict& onc_object) {
+  std::string* guid_ref = onc_object.FindString(key_guid_ref);
+  if (!guid_ref) {
     return true;
+  }
 
   std::string pem_encoded;
-  if (!GUIDRefToPEMEncoding(certs_by_guid, *guid_ref, &pem_encoded))
+  if (!GUIDRefToPEMEncoding(certs_by_guid, *guid_ref, &pem_encoded)) {
     return false;
+  }
 
-  onc_object->RemoveKey(key_guid_ref);
-  onc_object->SetKey(key_pem, base::Value(pem_encoded));
+  onc_object.Remove(key_guid_ref);
+  onc_object.Set(key_pem, pem_encoded);
   return true;
 }
 
@@ -232,14 +236,16 @@
                         base::Value::Dict& onc_object) {
   const base::Value::List* guid_ref_list =
       onc_object.FindList(key_guid_ref_list);
-  if (!guid_ref_list)
+  if (!guid_ref_list) {
     return true;
+  }
 
   base::Value::List pem_list;
   for (const auto& entry : *guid_ref_list) {
     std::string pem_encoded;
-    if (!GUIDRefToPEMEncoding(certs_by_guid, entry.GetString(), &pem_encoded))
+    if (!GUIDRefToPEMEncoding(certs_by_guid, entry.GetString(), &pem_encoded)) {
       return false;
+    }
 
     pem_list.Append(pem_encoded);
   }
@@ -256,12 +262,14 @@
                                 const std::string& key_pem_list,
                                 base::Value::Dict& onc_object) {
   std::string* guid_ref = onc_object.FindString(key_guid_ref);
-  if (!guid_ref)
+  if (!guid_ref) {
     return true;
+  }
 
   std::string pem_encoded;
-  if (!GUIDRefToPEMEncoding(certs_by_guid, *guid_ref, &pem_encoded))
+  if (!GUIDRefToPEMEncoding(certs_by_guid, *guid_ref, &pem_encoded)) {
     return false;
+  }
 
   base::Value::List pem_list;
   pem_list.Append(pem_encoded);
@@ -277,8 +285,7 @@
                                 const std::string& key_guid_refs,
                                 const std::string& key_guid_ref,
                                 const std::string& key_pem_list,
-                                base::Value* onc_object) {
-  base::Value::Dict& onc_dict = onc_object->GetDict();
+                                base::Value::Dict& onc_dict) {
   if (onc_dict.contains(key_guid_refs)) {
     if (onc_dict.contains(key_guid_ref)) {
       LOG(ERROR) << "Found both " << key_guid_refs << " and " << key_guid_ref
@@ -294,16 +301,14 @@
                                     onc_dict);
 }
 
-// Resolve known server and authority certiifcate reference fields in
+// Resolve known server and authority certificate reference fields in
 // |onc_object|.
 bool ResolveServerCertRefsInObject(const CertPEMsByGUIDMap& certs_by_guid,
                                    const OncValueSignature& signature,
-                                   base::Value* onc_object) {
-  DCHECK(onc_object->is_dict());
+                                   base::Value::Dict& onc_object) {
   if (&signature == &kCertificatePatternSignature) {
     if (!ResolveCertRefList(certs_by_guid, ::onc::client_cert::kIssuerCARef,
-                            ::onc::client_cert::kIssuerCAPEMs,
-                            onc_object->GetDict())) {
+                            ::onc::client_cert::kIssuerCAPEMs, onc_object)) {
       return false;
     }
   } else if (&signature == &kEAPSignature) {
@@ -331,17 +336,20 @@
   }
 
   // Recurse into nested objects.
-  for (auto it : onc_object->DictItems()) {
-    if (!it.second.is_dict())
+  for (auto it : onc_object) {
+    if (!it.second.is_dict()) {
       continue;
+    }
 
     const OncFieldSignature* field_signature =
         GetFieldSignature(signature, it.first);
-    if (!field_signature)
+    if (!field_signature) {
       continue;
+    }
 
-    if (!ResolveServerCertRefsInObject(
-            certs_by_guid, *field_signature->value_signature, &it.second)) {
+    if (!ResolveServerCertRefsInObject(certs_by_guid,
+                                       *field_signature->value_signature,
+                                       it.second.GetDict())) {
       return false;
     }
   }
@@ -372,7 +380,8 @@
   return std::move(*parsed_json).TakeDict();
 }
 
-base::Value Decrypt(const std::string& passphrase, const base::Value& root) {
+absl::optional<base::Value::Dict> Decrypt(const std::string& passphrase,
+                                          const base::Value::Dict& root) {
   const int kKeySizeInBits = 256;
   const int kMaxIterationCount = 500000;
   std::string onc_type;
@@ -396,32 +405,32 @@
       !GetString(root, ::onc::toplevel_config::kType, &onc_type) ||
       onc_type != ::onc::toplevel_config::kEncryptedConfiguration) {
     NET_LOG(ERROR) << "Encrypted ONC malformed.";
-    return base::Value();
+    return absl::nullopt;
   }
 
   if (hmac_method != ::onc::encrypted::kSHA1 ||
       cipher != ::onc::encrypted::kAES256 ||
       stretch_method != ::onc::encrypted::kPBKDF2) {
     NET_LOG(ERROR) << "Encrypted ONC unsupported encryption scheme.";
-    return base::Value();
+    return absl::nullopt;
   }
 
   // Make sure iterations != 0, since that's not valid.
   if (iterations == 0) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return base::Value();
+    return absl::nullopt;
   }
 
   // Simply a sanity check to make sure we can't lock up the machine
   // for too long with a huge number (or a negative number).
   if (iterations < 0 || iterations > kMaxIterationCount) {
     NET_LOG(ERROR) << "Too many iterations in encrypted ONC";
-    return base::Value();
+    return absl::nullopt;
   }
 
   if (!base::Base64Decode(salt, &salt)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return base::Value();
+    return absl::nullopt;
   }
 
   std::unique_ptr<crypto::SymmetricKey> key(
@@ -431,43 +440,42 @@
 
   if (!base::Base64Decode(initial_vector, &initial_vector)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return base::Value();
+    return absl::nullopt;
   }
   if (!base::Base64Decode(ciphertext, &ciphertext)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return base::Value();
+    return absl::nullopt;
   }
   if (!base::Base64Decode(hmac, &hmac)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return base::Value();
+    return absl::nullopt;
   }
 
   crypto::HMAC hmac_verifier(crypto::HMAC::SHA1);
   if (!hmac_verifier.Init(key.get()) ||
       !hmac_verifier.Verify(ciphertext, hmac)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return base::Value();
+    return absl::nullopt;
   }
 
   crypto::Encryptor decryptor;
   if (!decryptor.Init(key.get(), crypto::Encryptor::CBC, initial_vector)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return base::Value();
+    return absl::nullopt;
   }
 
   std::string plaintext;
   if (!decryptor.Decrypt(ciphertext, &plaintext)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return base::Value();
+    return absl::nullopt;
   }
 
   absl::optional<base::Value::Dict> new_root =
       ReadDictionaryFromJson(plaintext);
   if (!new_root) {
     NET_LOG(ERROR) << "Property dictionary malformed.";
-    return base::Value();
   }
-  return base::Value(std::move(*new_root));
+  return new_root;
 }
 
 std::string GetSourceAsString(::onc::ONCSource source) {
@@ -542,11 +550,13 @@
 }
 
 void FillInHexSSIDField(base::Value::Dict& wifi_fields) {
-  if (wifi_fields.Find(::onc::wifi::kHexSSID))
+  if (wifi_fields.Find(::onc::wifi::kHexSSID)) {
     return;
+  }
   std::string* ssid = wifi_fields.FindString(::onc::wifi::kSSID);
-  if (!ssid)
+  if (!ssid) {
     return;
+  }
   if (ssid->empty()) {
     NET_LOG(ERROR) << "Found empty SSID field.";
     return;
@@ -557,18 +567,21 @@
 
 void SetHiddenSSIDFieldInOncObject(const OncValueSignature& signature,
                                    base::Value::Dict& onc_object) {
-  if (&signature == &kWiFiSignature)
+  if (&signature == &kWiFiSignature) {
     SetHiddenSSIDField(onc_object);
+  }
 
   // Recurse into nested objects.
   for (auto it : onc_object) {
-    if (!it.second.is_dict())
+    if (!it.second.is_dict()) {
       continue;
+    }
 
     const OncFieldSignature* field_signature =
         GetFieldSignature(signature, it.first);
-    if (!field_signature)
+    if (!field_signature) {
       continue;
+    }
 
     SetHiddenSSIDFieldInOncObject(*field_signature->value_signature,
                                   it.second.GetDict());
@@ -576,8 +589,9 @@
 }
 
 void SetHiddenSSIDField(base::Value::Dict& wifi_fields) {
-  if (wifi_fields.Find(::onc::wifi::kHiddenSSID))
+  if (wifi_fields.Find(::onc::wifi::kHiddenSSID)) {
     return;
+  }
   wifi_fields.Set(::onc::wifi::kHiddenSSID, false);
 }
 
@@ -621,30 +635,34 @@
                                   base::Value::List* network_configs,
                                   base::Value::Dict* global_network_config,
                                   base::Value::List* certificates) {
-  if (network_configs)
+  if (network_configs) {
     network_configs->clear();
-  if (global_network_config)
+  }
+  if (global_network_config) {
     global_network_config->clear();
-  if (certificates)
+  }
+  if (certificates) {
     certificates->clear();
-  if (onc_blob.empty())
+  }
+  if (onc_blob.empty()) {
     return true;
+  }
 
-  absl::optional<base::Value::Dict> toplevel_onc_dict =
+  absl::optional<base::Value::Dict> toplevel_onc =
       ReadDictionaryFromJson(onc_blob);
-  if (!toplevel_onc_dict) {
+  if (!toplevel_onc) {
     NET_LOG(ERROR) << "Not a valid ONC JSON dictionary: "
                    << GetSourceAsString(onc_source);
     return false;
   }
-  base::Value toplevel_onc(std::move(*toplevel_onc_dict));
 
   // Check and see if this is an encrypted ONC file. If so, decrypt it.
   std::string onc_type;
-  if (GetString(toplevel_onc, ::onc::toplevel_config::kType, &onc_type) &&
+  if (GetString(toplevel_onc.value(), ::onc::toplevel_config::kType,
+                &onc_type) &&
       onc_type == ::onc::toplevel_config::kEncryptedConfiguration) {
-    toplevel_onc = Decrypt(passphrase, toplevel_onc);
-    if (toplevel_onc.is_none()) {
+    toplevel_onc = Decrypt(passphrase, toplevel_onc.value());
+    if (!toplevel_onc.has_value()) {
       NET_LOG(ERROR) << "Unable to decrypt ONC from "
                      << GetSourceAsString(onc_source);
       return false;
@@ -656,17 +674,17 @@
 
   // Validate the ONC dictionary. We are liberal and ignore unknown field
   // names and ignore invalid field names in kRecommended arrays.
-  Validator validator(false,  // Ignore unknown fields.
-                      false,  // Ignore invalid recommended field names.
-                      true,   // Fail on missing fields.
-                      from_policy,
-                      true);  // Log warnings.
+  Validator validator(/*error_on_unknown_field=*/false,
+                      /*error_on_wrong_recommended=*/false,
+                      /*error_on_missing_field=*/true,
+                      /*managed_onc=*/from_policy,
+                      /*log_warnings=*/true);
   validator.SetOncSource(onc_source);
 
   Validator::Result validation_result;
   absl::optional<base::Value::Dict> validated_toplevel_onc =
       validator.ValidateAndRepairObject(&kToplevelConfigurationSignature,
-                                        toplevel_onc.GetDict(),
+                                        toplevel_onc.value(),
                                         &validation_result);
 
   if (from_policy) {
@@ -715,8 +733,9 @@
       success = false;
     }
 
-    if (network_configs)
+    if (network_configs) {
       *network_configs = std::move(*validated_networks_list);
+    }
   }
 
   if (global_network_config) {
@@ -736,8 +755,7 @@
   bool success = true;
   base::Value::List filtered_configs;
   for (base::Value& network : network_configs) {
-    DCHECK(network.is_dict());
-    if (!ResolveServerCertRefsInNetwork(certs_by_guid, &network)) {
+    if (!ResolveServerCertRefsInNetwork(certs_by_guid, network.GetDict())) {
       std::string* guid =
           network.GetDict().FindString(::onc::network_config::kGUID);
       // This might happen even with correct validation, if the referenced
@@ -755,10 +773,9 @@
 }
 
 bool ResolveServerCertRefsInNetwork(const CertPEMsByGUIDMap& certs_by_guid,
-                                    base::Value* network_config) {
+                                    base::Value::Dict& network_config) {
   return ResolveServerCertRefsInObject(
       certs_by_guid, kNetworkConfigurationSignature, network_config);
 }
 
-}  // namespace onc
-}  // namespace chromeos
+}  // namespace chromeos::onc
diff --git a/chromeos/components/onc/onc_utils.h b/chromeos/components/onc/onc_utils.h
index eb88343..99807fc 100644
--- a/chromeos/components/onc/onc_utils.h
+++ b/chromeos/components/onc/onc_utils.h
@@ -32,9 +32,10 @@
 
 // Decrypts the given EncryptedConfiguration |onc| (see the ONC specification)
 // using |passphrase|. The resulting UnencryptedConfiguration is returned. If an
-// error occurs, returns an empty Value.
+// error occurs, returns nullopt.
 COMPONENT_EXPORT(CHROMEOS_ONC)
-base::Value Decrypt(const std::string& passphrase, const base::Value& onc);
+absl::optional<base::Value::Dict> Decrypt(const std::string& passphrase,
+                                          const base::Value::Dict& onc);
 
 // For logging only: strings not user facing.
 COMPONENT_EXPORT(CHROMEOS_ONC)
@@ -110,7 +111,7 @@
 
 // Replaces all references by GUID to Server or CA certs by their PEM
 // encoding. Returns true if all references could be resolved. Otherwise returns
-// false and network configurations with unresolveable references are removed
+// false and network configurations with unresolvable references are removed
 // from |network_configs|. |network_configs| must be a list of ONC
 // NetworkConfiguration dictionaries.
 COMPONENT_EXPORT(CHROMEOS_ONC)
@@ -122,7 +123,7 @@
 // must be a ONC NetworkConfiguration.
 COMPONENT_EXPORT(CHROMEOS_ONC)
 bool ResolveServerCertRefsInNetwork(const CertPEMsByGUIDMap& certs_by_guid,
-                                    base::Value* network_config);
+                                    base::Value::Dict& network_config);
 
 }  // namespace onc
 }  // namespace chromeos
diff --git a/chromeos/components/onc/onc_utils_unittest.cc b/chromeos/components/onc/onc_utils_unittest.cc
index 0e0c068..db11af6 100644
--- a/chromeos/components/onc/onc_utils_unittest.cc
+++ b/chromeos/components/onc/onc_utils_unittest.cc
@@ -27,35 +27,37 @@
 namespace chromeos::onc {
 
 TEST(ONCDecrypterTest, BrokenEncryptionIterations) {
-  base::Value encrypted_onc =
-      test_utils::ReadTestDictionaryValue("broken-encrypted-iterations.onc");
+  base::Value::Dict encrypted_onc =
+      test_utils::ReadTestDictionary("broken-encrypted-iterations.onc");
 
-  base::Value decrypted_onc = Decrypt("test0000", encrypted_onc);
+  absl::optional<base::Value::Dict> decrypted_onc =
+      Decrypt("test0000", encrypted_onc);
 
-  EXPECT_TRUE(decrypted_onc.is_none());
+  EXPECT_FALSE(decrypted_onc.has_value());
 }
 
 TEST(ONCDecrypterTest, BrokenEncryptionZeroIterations) {
-  base::Value encrypted_onc = test_utils::ReadTestDictionaryValue(
-      "broken-encrypted-zero-iterations.onc");
+  base::Value::Dict encrypted_onc =
+      test_utils::ReadTestDictionary("broken-encrypted-zero-iterations.onc");
 
-  base::Value decrypted_onc = Decrypt("test0000", encrypted_onc);
+  absl::optional<base::Value::Dict> decrypted_onc =
+      Decrypt("test0000", encrypted_onc);
 
-  EXPECT_TRUE(decrypted_onc.is_none());
+  EXPECT_FALSE(decrypted_onc.has_value());
 }
 
 TEST(ONCDecrypterTest, LoadEncryptedOnc) {
-  base::Value encrypted_onc =
-      test_utils::ReadTestDictionaryValue("encrypted.onc");
-  base::Value expected_decrypted_onc =
-      test_utils::ReadTestDictionaryValue("decrypted.onc");
+  base::Value::Dict encrypted_onc =
+      test_utils::ReadTestDictionary("encrypted.onc");
+  base::Value::Dict expected_decrypted_onc =
+      test_utils::ReadTestDictionary("decrypted.onc");
 
   std::string error;
-  base::Value actual_decrypted_onc = Decrypt("test0000", encrypted_onc);
+  absl::optional<base::Value::Dict> actual_decrypted_onc =
+      Decrypt("test0000", encrypted_onc);
 
-  base::Value emptyDict;
-  EXPECT_TRUE(
-      test_utils::Equals(&expected_decrypted_onc, &actual_decrypted_onc));
+  EXPECT_TRUE(test_utils::Equals(&expected_decrypted_onc,
+                                 &actual_decrypted_onc.value()));
 }
 
 namespace {
diff --git a/chromeos/components/onc/onc_validator.cc b/chromeos/components/onc/onc_validator.cc
index 6959906..38e41672 100644
--- a/chromeos/components/onc/onc_validator.cc
+++ b/chromeos/components/onc/onc_validator.cc
@@ -71,8 +71,7 @@
       error_on_wrong_recommended_(error_on_wrong_recommended),
       error_on_missing_field_(error_on_missing_field),
       managed_onc_(managed_onc),
-      log_warnings_(log_warnings),
-      onc_source_(::onc::ONC_SOURCE_NONE) {}
+      log_warnings_(log_warnings) {}
 
 Validator::~Validator() = default;
 
diff --git a/chromeos/components/onc/onc_validator.h b/chromeos/components/onc/onc_validator.h
index 1c7a710..3093108 100644
--- a/chromeos/components/onc/onc_validator.h
+++ b/chromeos/components/onc/onc_validator.h
@@ -209,7 +209,7 @@
   void ValidateEthernetConfigs(base::Value::List* result);
   void OnlyKeepLast(base::Value::List* network_configurations_list,
                     const std::vector<std::string>& guids,
-                    const char* type);
+                    const char* type_for_messages);
   void RemoveNetworkConfigurationWithGuid(
       base::Value::List* network_configurations_list,
       const std::string& guid_to_remove);
@@ -277,7 +277,7 @@
   const bool managed_onc_;
   const bool log_warnings_;
 
-  ::onc::ONCSource onc_source_;
+  ::onc::ONCSource onc_source_ = ::onc::ONC_SOURCE_NONE;
 
   // The path of field names and indices to the current value. Indices
   // are stored as strings in decimal notation.
diff --git a/chromeos/components/onc/onc_validator_unittest.cc b/chromeos/components/onc/onc_validator_unittest.cc
index 9c516f8..05e49ac 100644
--- a/chromeos/components/onc/onc_validator_unittest.cc
+++ b/chromeos/components/onc/onc_validator_unittest.cc
@@ -318,9 +318,9 @@
   // Load the common test data and return the dictionary at the field with
   // name |name|.
   base::Value::Dict GetDictionaryFromTestFile(const std::string& name) {
-    base::Value dict = test_utils::ReadTestDictionaryValue(
-        "invalid_settings_with_repairs.json");
-    base::Value::Dict* result = dict.GetDict().FindDict(name);
+    base::Value::Dict dict =
+        test_utils::ReadTestDictionary("invalid_settings_with_repairs.json");
+    base::Value::Dict* result = dict.FindDict(name);
     EXPECT_TRUE(result);
     return result ? std::move(*result) : base::Value::Dict();
   }
diff --git a/chromeos/components/onc/variable_expander.cc b/chromeos/components/onc/variable_expander.cc
index 8e6e2f1..c3a9972 100644
--- a/chromeos/components/onc/variable_expander.cc
+++ b/chromeos/components/onc/variable_expander.cc
@@ -41,7 +41,7 @@
 //   - ${variable_name,pos,count} -> |replacement.substr(pos,count)|
 // Strictly enforces the format (up to whitespace), e.g.
 // ${variable_name ,  2 , 9  } works, but ${variable_name,2o,9e} doesn't.
-// Returns true if no error occured.
+// Returns true if no error occurred.
 bool Expand(base::StringPiece variable_name,
             base::StringPiece replacement,
             std::string* str) {
@@ -128,8 +128,9 @@
     }
 
     case base::Value::Type::DICT: {
-      for (const auto child : value->DictItems())
+      for (const auto child : value->GetDict()) {
         no_error &= ExpandValue(&child.second);
+      }
       break;
     }
 
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu.cc b/chromeos/ui/frame/multitask_menu/multitask_menu.cc
index ca838aa..efe52ca 100644
--- a/chromeos/ui/frame/multitask_menu/multitask_menu.cc
+++ b/chromeos/ui/frame/multitask_menu/multitask_menu.cc
@@ -27,7 +27,7 @@
 constexpr int kPaddingNarrow = 8;
 
 // Dogfood feedback button layout values.
-constexpr int kButtonWidth = 130;
+constexpr int kButtonWidth = 120;
 constexpr int kButtonHeight = 28;
 
 }  // namespace
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu_view.cc b/chromeos/ui/frame/multitask_menu/multitask_menu_view.cc
index bb163310..eee8ee7 100644
--- a/chromeos/ui/frame/multitask_menu/multitask_menu_view.cc
+++ b/chromeos/ui/frame/multitask_menu/multitask_menu_view.cc
@@ -20,15 +20,20 @@
 #include "chromeos/ui/frame/multitask_menu/multitask_menu_metrics.h"
 #include "chromeos/ui/frame/multitask_menu/split_button_view.h"
 #include "chromeos/ui/vector_icons/vector_icons.h"
-#include "chromeos/ui/wm/features.h"
 #include "ui/aura/window.h"
 #include "ui/base/default_style.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/display/screen.h"
+#include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
+#include "ui/gfx/text_constants.h"
+#include "ui/views/animation/ink_drop.h"
+#include "ui/views/animation/ink_drop_host.h"
 #include "ui/views/background.h"
+#include "ui/views/border.h"
 #include "ui/views/controls/button/button.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/widget/widget.h"
 
@@ -41,8 +46,11 @@
 
 // Dogfood feedback button layout values.
 constexpr int kButtonHeight = 28;
+// The space between the text and image in the feedback button.
+constexpr int kButtonImageSpacing = 4;
 // Divisor to determine the radius of the rounded corners for the button.
 constexpr float kButtonRadDivisor = 2.f;
+constexpr gfx::Insets kButtonInsets = gfx::Insets::TLBR(0, 6, 0, 8);
 
 // Creates multitask button with label.
 std::unique_ptr<views::View> CreateButtonContainer(
@@ -141,6 +149,20 @@
   feedback_button_ = AddChildView(std::make_unique<views::LabelButton>(
       views::Button::PressedCallback(),
       l10n_util::GetStringUTF16(IDS_MULTITASK_MENU_FEEDBACK_BUTTON_NAME)));
+
+  feedback_button_->SetImageLabelSpacing(kButtonImageSpacing);
+  feedback_button_->SetBorder(views::CreateEmptyBorder(kButtonInsets));
+  feedback_button_->SetHorizontalAlignment(
+      gfx::HorizontalAlignment::ALIGN_CENTER);
+  feedback_button_->SetBackground(views::CreateThemedRoundedRectBackground(
+      ui::kColorMultitaskFeedbackButtonLabelBackground,
+      kButtonHeight / kButtonRadDivisor));
+
+  views::InkDropHost* const ink_drop = views::InkDrop::Get(feedback_button_);
+  ink_drop->SetMode(views::InkDropHost::InkDropMode::ON);
+  ink_drop->SetBaseColor(SK_ColorGRAY);
+  views::InstallRoundRectHighlightPathGenerator(
+      feedback_button_, gfx::Insets(), kButtonHeight / kButtonRadDivisor);
 }
 
 MultitaskMenuView::~MultitaskMenuView() = default;
@@ -160,12 +182,6 @@
           kDogfoodPawIcon,
           color_provider->GetColor(
               ui::kColorMultitaskFeedbackButtonLabelForeground)));
-  feedback_button_->SetBackground(views::CreateRoundedRectBackground(
-      color_provider->GetColor(
-          ui::kColorMultitaskFeedbackButtonLabelBackground),
-      kButtonHeight / kButtonRadDivisor));
-
-  // TODO(hewer): Change margin between icon and text to match spec.
 }
 
 void MultitaskMenuView::SplitButtonPressed(SnapDirection direction) {
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 79ce9d6..dee253d4 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -601,7 +601,10 @@
   }
 
   if (is_win) {
-    deps += [ "//components/winhttp:unit_tests" ]
+    deps += [
+      "//components/stability_report:unit_tests",
+      "//components/winhttp:unit_tests",
+    ]
   }
 
   if (enable_printing) {
diff --git a/components/assist_ranker/ranker_model_loader_impl_unittest.cc b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
index 52dd440a..6d5fa13 100644
--- a/components/assist_ranker/ranker_model_loader_impl_unittest.cc
+++ b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
@@ -30,7 +30,6 @@
 using assist_ranker::RankerModelStatus;
 
 const char kInvalidModelData[] = "not a valid model";
-const int kInvalidModelSize = sizeof(kInvalidModelData) - 1;
 
 class RankerModelLoaderImplTest : public ::testing::Test {
  public:
@@ -197,9 +196,7 @@
             base::Days(30), &expired_model_);
   SaveModel(local_model_, local_model_path_);
   SaveModel(expired_model_, expired_model_path_);
-  ASSERT_EQ(base::WriteFile(invalid_model_path_, kInvalidModelData,
-                            kInvalidModelSize),
-            kInvalidModelSize);
+  ASSERT_TRUE(base::WriteFile(invalid_model_path_, kInvalidModelData));
 }
 
 void RankerModelLoaderImplTest::InitModel(const GURL& model_url,
@@ -232,8 +229,7 @@
 void RankerModelLoaderImplTest::SaveModel(const RankerModel& model,
                                           const base::FilePath& model_path) {
   std::string model_str = model.SerializeAsString();
-  ASSERT_EQ(base::WriteFile(model_path, model_str.data(), model_str.size()),
-            static_cast<int>(model_str.size()));
+  ASSERT_TRUE(base::WriteFile(model_path, model_str));
 }
 
 RankerModelStatus RankerModelLoaderImplTest::ValidateModel(
diff --git a/components/autofill/README.md b/components/autofill/README.md
index 7396416d..80f9f4ed 100644
--- a/components/autofill/README.md
+++ b/components/autofill/README.md
@@ -51,14 +51,14 @@
 ┌─┴──────────────────┐     │          ┌─┴───────────────────┐ │   │owns N         queries│
 │ChromeAutofillClient◄─────┼──────────┤AutofillManager      ├─┼───┴──────────────────────┘
 │1 per WebContents   │     │  weak ref│1 per RenderFrameHost│ │
-└────────────────────┘     │          └─▲─────────────────┬─┘ │
-                           │            │           events│   │
-                           └────────────┼────────────────►│◄──┘
-                                        │                 │
-                           ┌────────────┼─────────────────┼────────────┐
-                           │owns 1      │events           │            │
-                           │            │owns 1           │            │
-┌──────────────────────────┴─┐        ┌─┴─────────────────▼─┐        ┌─▼───────────────────┐
+└─┬──────────────────┘     │          └─▲─────────────────┬─┘ │
+  │owns 1                  │            │           events│   │
+  │                        └────────────┼────────────────►│◄──┘
+  │                                     │                 │
+  │                        ┌────────────┼─────────────────┼────────────┐
+  │                        │owns 1      │events           │            │
+  │                        │            │owns 1           │            │
+┌─▼────────────────────────┴─┐        ┌─┴─────────────────▼─┐        ┌─▼───────────────────┐
 │ContentAutofillDriverFactory├────────►ContentAutofillDriver◄────────►ContentAutofillRouter│
 │1 per WebContents           │owns N  │1 per RenderFrameHost│ events │1 per WebContents    │
 └────────────────────────────┘        └─▲─────────┬─────────┘        └─────────────────────┘
diff --git a/components/autofill/content/browser/BUILD.gn b/components/autofill/content/browser/BUILD.gn
index 6551b87..fe454361 100644
--- a/components/autofill/content/browser/BUILD.gn
+++ b/components/autofill/content/browser/BUILD.gn
@@ -10,6 +10,8 @@
     "autofill_log_router_factory.h",
     "bad_message.cc",
     "bad_message.h",
+    "content_autofill_client.cc",
+    "content_autofill_client.h",
     "content_autofill_driver.cc",
     "content_autofill_driver.h",
     "content_autofill_driver_factory.cc",
@@ -84,10 +86,13 @@
     "test_autofill_client_injector.h",
     "test_autofill_manager_injector.cc",
     "test_autofill_manager_injector.h",
+    "test_content_autofill_client.cc",
+    "test_content_autofill_client.h",
   ]
 
   public_deps = [
     ":browser",
+    "//components/autofill/core/browser:test_support",
     "//content/public/browser",
     "//content/test:test_support",
   ]
diff --git a/components/autofill/content/browser/content_autofill_client.cc b/components/autofill/content/browser/content_autofill_client.cc
new file mode 100644
index 0000000..614217e
--- /dev/null
+++ b/components/autofill/content/browser/content_autofill_client.cc
@@ -0,0 +1,26 @@
+// 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 "components/autofill/content/browser/content_autofill_client.h"
+
+namespace autofill {
+
+ContentAutofillClient::ContentAutofillClient(
+    content::WebContents* web_contents,
+    ContentAutofillDriverFactory::DriverInitCallback driver_init_hook)
+    : content::WebContentsUserData<ContentAutofillClient>(*web_contents),
+      autofill_driver_factory_(web_contents,
+                               this,
+                               std::move(driver_init_hook)) {}
+
+ContentAutofillClient::~ContentAutofillClient() = default;
+
+ContentAutofillDriverFactory*
+ContentAutofillClient::GetAutofillDriverFactory() {
+  return &autofill_driver_factory_;
+}
+
+WEB_CONTENTS_USER_DATA_KEY_IMPL(ContentAutofillClient);
+
+}  // namespace autofill
diff --git a/components/autofill/content/browser/content_autofill_client.h b/components/autofill/content/browser/content_autofill_client.h
new file mode 100644
index 0000000..734f585
--- /dev/null
+++ b/components/autofill/content/browser/content_autofill_client.h
@@ -0,0 +1,41 @@
+// 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 COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_CLIENT_H_
+#define COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_CLIENT_H_
+
+#include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/core/browser/autofill_client.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+namespace autofill {
+
+// Common base class for those AutofillClients that have the //content layer.
+class ContentAutofillClient
+    : public AutofillClient,
+      public content::WebContentsUserData<ContentAutofillClient> {
+ public:
+  ContentAutofillClient(
+      content::WebContents* web_contents,
+      ContentAutofillDriverFactory::DriverInitCallback driver_init_hook);
+  ContentAutofillClient(const ContentAutofillClient&) = delete;
+  ContentAutofillClient& operator=(const ContentAutofillClient&) = delete;
+  ~ContentAutofillClient() override;
+
+  // Intentionally non-virtual to allow it to be called during construction (in
+  // particular, transitively by members of subclasses).
+  ContentAutofillDriverFactory* GetAutofillDriverFactory();
+
+ private:
+  friend class content::WebContentsUserData<ContentAutofillClient>;
+
+  ContentAutofillDriverFactory autofill_driver_factory_;
+
+  WEB_CONTENTS_USER_DATA_KEY_DECL();
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CONTENT_BROWSER_CONTENT_AUTOFILL_CLIENT_H_
diff --git a/components/autofill/content/browser/content_autofill_driver.cc b/components/autofill/content/browser/content_autofill_driver.cc
index 3de75be..7066065 100644
--- a/components/autofill/content/browser/content_autofill_driver.cc
+++ b/components/autofill/content/browser/content_autofill_driver.cc
@@ -62,6 +62,9 @@
   if (autofill_router_)  // Can be nullptr only in tests.
     autofill_router_->UnregisterDriver(this);
 
+  // DONOTSUBMIT: Need to check whether RWH can be nullptr. I can't find the
+  // test right now where this happened, so I want to run the bots again. I had
+  // a hypothesis why that happened in that test.
   if (render_frame_host_) {  // Can be nullptr only in tests.
     render_frame_host_->GetRenderWidgetHost()->RemoveSuppressShowingImeCallback(
         suppress_showing_ime_callback_);
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.cc b/components/autofill/content/browser/content_autofill_driver_factory.cc
index 2bfb57f..a789015f 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory.cc
+++ b/components/autofill/content/browser/content_autofill_driver_factory.cc
@@ -10,6 +10,7 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -49,27 +50,15 @@
     driver->GetAutofillAgent()->EnableHeavyFormDataScraping();
 }
 
-const char ContentAutofillDriverFactory::
-    kContentAutofillDriverFactoryWebContentsUserDataKey[] =
-        "web_contents_autofill_driver_factory";
-
-// static
-void ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-    content::WebContents* contents,
-    AutofillClient* client,
-    DriverInitCallback driver_init_hook) {
-  if (FromWebContents(contents))
-    return;
-  contents->SetUserData(kContentAutofillDriverFactoryWebContentsUserDataKey,
-                        base::WrapUnique(new ContentAutofillDriverFactory(
-                            contents, client, std::move(driver_init_hook))));
-}
-
 // static
 ContentAutofillDriverFactory* ContentAutofillDriverFactory::FromWebContents(
     content::WebContents* contents) {
-  return static_cast<ContentAutofillDriverFactory*>(contents->GetUserData(
-      kContentAutofillDriverFactoryWebContentsUserDataKey));
+  ContentAutofillClient* client =
+      ContentAutofillClient::FromWebContents(contents);
+  if (!client) {
+    return nullptr;
+  }
+  return client->GetAutofillDriverFactory();
 }
 
 // static
diff --git a/components/autofill/content/browser/content_autofill_driver_factory.h b/components/autofill/content/browser/content_autofill_driver_factory.h
index 495fdcf3..0c480edf 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory.h
+++ b/components/autofill/content/browser/content_autofill_driver_factory.h
@@ -36,26 +36,14 @@
                            const std::string& app_locale,
                            ContentAutofillDriver* driver);
 
-// Manages lifetime of ContentAutofillDriver. One Factory per WebContents
-// creates one Driver per RenderFrame.
-class ContentAutofillDriverFactory : public content::WebContentsObserver,
-                                     public base::SupportsUserData::Data {
+// Manages lifetime of ContentAutofillDriver. Owned by ContentAutofillClient,
+// therefore one Factory per WebContents. Creates one Driver per
+// RenderFrameHost.
+class ContentAutofillDriverFactory : public content::WebContentsObserver {
  public:
   using DriverInitCallback =
       base::RepeatingCallback<void(ContentAutofillDriver*)>;
 
-  static const char kContentAutofillDriverFactoryWebContentsUserDataKey[];
-
-  // Creates a factory for a WebContents object.
-  //
-  // The `driver_init_hook` is called whenever a driver is constructed, so it
-  // may configure the driver. In particular, it must create and set the
-  // driver's AutofillManager.
-  static void CreateForWebContentsAndDelegate(
-      content::WebContents* contents,
-      AutofillClient* client,
-      DriverInitCallback driver_init_hook);
-
   static ContentAutofillDriverFactory* FromWebContents(
       content::WebContents* contents);
 
@@ -63,6 +51,12 @@
       mojo::PendingAssociatedReceiver<mojom::AutofillDriver> pending_receiver,
       content::RenderFrameHost* render_frame_host);
 
+  ContentAutofillDriverFactory(content::WebContents* web_contents,
+                               AutofillClient* client,
+                               DriverInitCallback driver_init_hook);
+  ContentAutofillDriverFactory(ContentAutofillDriverFactory&) = delete;
+  ContentAutofillDriverFactory& operator=(ContentAutofillDriverFactory&) =
+      delete;
   ~ContentAutofillDriverFactory() override;
 
   // Gets the |ContentAutofillDriver| associated with |render_frame_host|.
@@ -84,14 +78,10 @@
  private:
   friend class ContentAutofillDriverFactoryTestApi;
 
-  ContentAutofillDriverFactory(content::WebContents* web_contents,
-                               AutofillClient* client,
-                               DriverInitCallback driver_init_hook);
-
   std::unique_ptr<ContentAutofillDriver> CreateDriver(
       content::RenderFrameHost* rfh);
 
-  raw_ptr<AutofillClient, DanglingUntriaged> client_;
+  raw_ptr<AutofillClient> client_;
   DriverInitCallback driver_init_hook_;
 
   // Routes events between different drivers.
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc b/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc
index 6f794722..d2eca1c2 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc
+++ b/components/autofill/content/browser/content_autofill_driver_factory_test_api.cc
@@ -4,10 +4,27 @@
 
 #include "components/autofill/content/browser/content_autofill_driver_factory_test_api.h"
 
+#include "base/functional/bind.h"
+#include "components/autofill/core/browser/test_browser_autofill_manager.h"
+
 namespace autofill {
 
 // static
 std::unique_ptr<ContentAutofillDriverFactory>
+ContentAutofillDriverFactoryTestApi::Create(content::WebContents* web_contents,
+                                            TestAutofillClient* client) {
+  return Create(
+      web_contents, client,
+      base::BindRepeating(
+          [](TestAutofillClient* client, ContentAutofillDriver* driver) {
+            driver->set_autofill_manager(
+                std::make_unique<TestBrowserAutofillManager>(driver, client));
+          },
+          client));
+}
+
+// static
+std::unique_ptr<ContentAutofillDriverFactory>
 ContentAutofillDriverFactoryTestApi::Create(
     content::WebContents* web_contents,
     AutofillClient* client,
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_test_api.h b/components/autofill/content/browser/content_autofill_driver_factory_test_api.h
index 8ba8cb7f..0417c72 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory_test_api.h
+++ b/components/autofill/content/browser/content_autofill_driver_factory_test_api.h
@@ -11,11 +11,18 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "components/autofill/content/browser/content_autofill_driver_factory.h"
+#include "components/autofill/core/browser/test_autofill_client.h"
 
 namespace autofill {
 
 class ContentAutofillDriverFactoryTestApi {
  public:
+  // Creates a factory of ContentAutofillDrivers whose managers are
+  // TestBrowserAutofillManager.
+  static std::unique_ptr<ContentAutofillDriverFactory> Create(
+      content::WebContents* web_contents,
+      TestAutofillClient* client);
+
   static std::unique_ptr<ContentAutofillDriverFactory> Create(
       content::WebContents* web_contents,
       AutofillClient* client,
diff --git a/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc b/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc
index f3ce40a..6bd709e 100644
--- a/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc
+++ b/components/autofill/content/browser/content_autofill_driver_factory_unittest.cc
@@ -132,8 +132,7 @@
 
     factory_ = ContentAutofillDriverFactoryTestApi::Create(
         web_contents(), client_.get(),
-        base::BindRepeating(&autofill::BrowserDriverInitHook, client_.get(),
-                            "en-US"));
+        base::BindRepeating(&BrowserDriverInitHook, client_.get(), "en-US"));
   }
 
   void TearDown() override {
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc
index f36e2c35..821967a4e 100644
--- a/components/autofill/content/browser/content_autofill_driver_unittest.cc
+++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -22,10 +22,10 @@
 #include "components/autofill/content/browser/content_autofill_driver_test_api.h"
 #include "components/autofill/content/browser/content_autofill_router.h"
 #include "components/autofill/content/browser/content_autofill_router_test_api.h"
+#include "components/autofill/content/browser/test_content_autofill_client.h"
 #include "components/autofill/core/browser/autofill_external_delegate.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
-#include "components/autofill/core/browser/test_autofill_client.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_switches.h"
@@ -59,6 +59,19 @@
 
 const char kAppLocale[] = "en-US";
 
+ContentAutofillDriverFactoryTestApi test_api(
+    ContentAutofillDriverFactory* cadf) {
+  return ContentAutofillDriverFactoryTestApi(cadf);
+}
+
+ContentAutofillRouterTestApi test_api(ContentAutofillRouter* cad) {
+  return ContentAutofillRouterTestApi(cad);
+}
+
+ContentAutofillDriverTestApi test_api(ContentAutofillDriver* cad) {
+  return ContentAutofillDriverTestApi(cad);
+}
+
 class FakeAutofillAgent : public mojom::AutofillAgent {
  public:
   FakeAutofillAgent()
@@ -321,11 +334,12 @@
     // happy for when AppendChild is called.
     NavigateAndCommit(GURL("about:blank"));
 
-    test_autofill_client_ = std::make_unique<TestAutofillClient>();
-    router_ = std::make_unique<ContentAutofillRouter>();
-    driver_ = std::make_unique<TestContentAutofillDriver>(
-        web_contents()->GetPrimaryMainFrame(), router_.get(),
-        test_autofill_client_.get());
+    auto client = std::make_unique<TestContentAutofillClient>(web_contents());
+    client_ = client.get();
+    web_contents()->SetUserData(client_->UserDataKey(), std::move(client));
+    factory_ = client_->GetAutofillDriverFactory();
+    router_ = &test_api(factory_).router();
+    driver_ = CreateDriver(web_contents()->GetPrimaryMainFrame());
 
     blink::AssociatedInterfaceProvider* remote_interfaces =
         web_contents()->GetPrimaryMainFrame()->GetRemoteAssociatedInterfaces();
@@ -335,10 +349,19 @@
                             base::Unretained(&fake_agent_)));
   }
 
+  TestContentAutofillDriver* CreateDriver(content::RenderFrameHost* rfh) {
+    auto driver =
+        std::make_unique<TestContentAutofillDriver>(rfh, router_, client_);
+    auto* raw_driver = driver.get();
+    test_api(factory_).SetDriver(raw_driver->render_frame_host(),
+                                 std::move(driver));
+    return raw_driver;
+  }
+
   void TearDown() override {
     // Reset the driver now to cause all pref observers to be removed and avoid
     // crashes that otherwise occur in the destructor.
-    driver_.reset();
+    web_contents()->RemoveUserData(client_->UserDataKey());
     content::RenderViewHostTestHarness::TearDown();
   }
 
@@ -377,9 +400,10 @@
   base::test::ScopedFeatureList scoped_feature_list_;
   test::AutofillEnvironment autofill_environment_;
 
-  std::unique_ptr<TestAutofillClient> test_autofill_client_;
-  std::unique_ptr<ContentAutofillRouter> router_;
-  std::unique_ptr<TestContentAutofillDriver> driver_;
+  TestContentAutofillClient* client_;
+  ContentAutofillDriverFactory* factory_;
+  ContentAutofillRouter* router_;
+  TestContentAutofillDriver* driver_;
 
   FakeAutofillAgent fake_agent_;
 };
@@ -407,11 +431,9 @@
 TEST_P(ContentAutofillDriverTest, SetFrameAndFormMetaDataOfForm) {
   NavigateAndCommit(GURL("https://username:password@hostname/path?query#hash"));
   FormData form;
-  form.fields.push_back(FormFieldData());
-  FormData form2 = ContentAutofillDriverTestApi(driver_.get())
-                       .GetFormWithFrameAndFormMetaData(form);
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form, nullptr);
+  form.fields.emplace_back();
+  FormData form2 = test_api(driver_).GetFormWithFrameAndFormMetaData(form);
+  test_api(driver_).SetFrameAndFormMetaData(form, nullptr);
 
   EXPECT_EQ(
       form.host_frame,
@@ -443,8 +465,7 @@
   ASSERT_TRUE(main_rfh()->GetLastCommittedURL().IsAboutBlank());
 
   FormData form;
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form, nullptr);
+  test_api(driver_).SetFrameAndFormMetaData(form, nullptr);
 
   EXPECT_TRUE(form.url.is_empty());
 }
@@ -454,12 +475,10 @@
   ASSERT_TRUE(main_rfh()->GetLastCommittedURL().IsAboutBlank());
 
   FormData form1;
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form1, nullptr);
+  test_api(driver_).SetFrameAndFormMetaData(form1, nullptr);
 
   FormData form2;
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form2, nullptr);
+  test_api(driver_).SetFrameAndFormMetaData(form2, nullptr);
 
   EXPECT_LT(form1.version, form2.version);
 }
@@ -478,14 +497,12 @@
           GURL("about:blank"),
           content::RenderFrameHostTester::For(child_rfh)->AppendChild(
               "grandchild"));
-  auto grandchild_driver = std::make_unique<TestContentAutofillDriver>(
-      grandchild_rfh, router_.get(), test_autofill_client_.get());
+  TestContentAutofillDriver* grandchild_driver = CreateDriver(grandchild_rfh);
   ASSERT_TRUE(child_rfh->GetLastCommittedURL().IsAboutBlank());
   ASSERT_TRUE(grandchild_rfh->GetLastCommittedURL().IsAboutBlank());
 
   FormData form;
-  ContentAutofillDriverTestApi(grandchild_driver.get())
-      .SetFrameAndFormMetaData(form, nullptr);
+  test_api(grandchild_driver).SetFrameAndFormMetaData(form, nullptr);
 
   EXPECT_EQ(form.url, GURL("https://hostname"));
 }
@@ -495,11 +512,10 @@
   // We test that `SetFrameAndFormMetaData(form, &field) sets the meta data not
   // just of |form|'s fields but also of an additional individual |field|.
   FormData form;
-  form.fields.push_back(FormFieldData());
+  form.fields.emplace_back();
   FormFieldData field = form.fields.back();
   FormSignature signature_without_meta_data = CalculateFormSignature(form);
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form, &field);
+  test_api(driver_).SetFrameAndFormMetaData(form, &field);
 
   EXPECT_NE(signature_without_meta_data, CalculateFormSignature(form));
   EXPECT_EQ(
@@ -574,8 +590,7 @@
   driver_->renderer_events().FormsSeen(/*updated_forms=*/{form},
                                        /*removed_forms=*/{});
 
-  ContentAutofillDriverTestApi(driver_.get())
-      .SetFrameAndFormMetaData(form, nullptr);
+  test_api(driver_).SetFrameAndFormMetaData(form, nullptr);
   ASSERT_EQ(augmented_forms.size(), 1u);
   EXPECT_TRUE(augmented_forms.front().SameFormAs(form));
 
@@ -664,31 +679,21 @@
 }
 
 TEST_P(ContentAutofillDriverTest, SetShouldSuppressKeyboard) {
-  auto driver_test_api = ContentAutofillDriverTestApi(driver_.get());
-  ASSERT_FALSE(driver_test_api.should_suppress_keyboard());
-  ContentAutofillRouterTestApi(&driver_test_api.autofill_router())
-      .set_last_queried_source(driver_.get());
+  ASSERT_FALSE(test_api(driver_).should_suppress_keyboard());
+  test_api(router_).set_last_queried_source(driver_);
 
   driver_->SetShouldSuppressKeyboard(true);
-  EXPECT_TRUE(driver_test_api.should_suppress_keyboard());
+  EXPECT_TRUE(test_api(driver_).should_suppress_keyboard());
 }
 
 TEST_P(ContentAutofillDriverTest, TriggerReparseInAllFrames) {
   base::RunLoop run_loop;
   fake_agent_.SetQuitLoopClosure(run_loop.QuitClosure());
-  ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      web_contents(), test_autofill_client_.get(),
-      ContentAutofillDriverFactory::DriverInitCallback());
-  auto factory_test_api = ContentAutofillDriverFactoryTestApi(
-      ContentAutofillDriverFactory::FromWebContents(web_contents()));
-  content::RenderFrameHost* rfh = driver_->render_frame_host();
-  factory_test_api.SetDriver(rfh, std::move(driver_));
-  ContentAutofillDriver* driver = factory_test_api.GetDriver(rfh);
   base::OnceCallback<void(bool)> trigger_reparse_finished_callback;
 
   EXPECT_CALL(fake_agent_, TriggerReparseWithResponse)
       .WillOnce(MoveArg<0>(&trigger_reparse_finished_callback));
-  driver->browser_events().TriggerReparseInAllFrames(base::BindOnce(
+  driver_->browser_events().TriggerReparseInAllFrames(base::BindOnce(
       [](base::RunLoop* run_loop, bool success) { run_loop->Quit(); },
       &run_loop));
   run_loop.RunUntilIdle();
diff --git a/components/autofill/content/browser/test_content_autofill_client.cc b/components/autofill/content/browser/test_content_autofill_client.cc
new file mode 100644
index 0000000..bbb9f4b
--- /dev/null
+++ b/components/autofill/content/browser/test_content_autofill_client.cc
@@ -0,0 +1,17 @@
+// 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 "components/autofill/content/browser/test_content_autofill_client.h"
+
+#include "components/autofill/core/browser/browser_autofill_manager.h"
+
+namespace autofill {
+
+TestContentAutofillClient::TestContentAutofillClient(
+    content::WebContents* web_contents)
+    : TestContentAutofillClient(
+          web_contents,
+          base::BindRepeating(&BrowserDriverInitHook, this, "en-US")) {}
+
+}  // namespace autofill
diff --git a/components/autofill/content/browser/test_content_autofill_client.h b/components/autofill/content/browser/test_content_autofill_client.h
new file mode 100644
index 0000000..789449e
--- /dev/null
+++ b/components/autofill/content/browser/test_content_autofill_client.h
@@ -0,0 +1,34 @@
+// 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 COMPONENTS_AUTOFILL_CONTENT_BROWSER_TEST_CONTENT_AUTOFILL_CLIENT_H_
+#define COMPONENTS_AUTOFILL_CONTENT_BROWSER_TEST_CONTENT_AUTOFILL_CLIENT_H_
+
+#include "base/functional/bind.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
+#include "components/autofill/core/browser/test_autofill_client.h"
+#include "content/public/browser/web_contents.h"
+
+namespace autofill {
+
+// A variant of TestAutofillClient that can be associated with a
+// content::WebContents.
+//
+// The typical pattern to associate it with a content::WebContents:
+//   auto client = std::make_unique<TestContentAutofillClient>(web_contents);
+//   web_contents->SetUserData(client->UserData(), std::move(client));
+//   ...
+//   web_contents->RemoveUserData(client->UserData());
+class TestContentAutofillClient
+    : public TestAutofillClientTemplate<ContentAutofillClient> {
+ public:
+  explicit TestContentAutofillClient(content::WebContents* web_contents);
+
+  using TestAutofillClientTemplate<
+      ContentAutofillClient>::TestAutofillClientTemplate;
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CONTENT_BROWSER_TEST_CONTENT_AUTOFILL_CLIENT_H_
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 0efeb47f..aa9baa9c 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -692,7 +692,6 @@
     "test_address_normalizer.h",
     "test_autofill_async_observer.cc",
     "test_autofill_async_observer.h",
-    "test_autofill_client.cc",
     "test_autofill_client.h",
     "test_autofill_clock.cc",
     "test_autofill_clock.h",
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 5190501..82b000f 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -918,6 +918,13 @@
   if (candidate_iban.value().empty())
     return absl::nullopt;
 
+  // Sets the `kAutofillHasSeenIban` pref to true indicating that the user has
+  // submitted a form with an IBAN, which indicates that the user is familiar
+  // with IBANs as a concept. We set the pref so that even if the user travels
+  // to a country where IBAN functionality is not typically used, they will
+  // still be able to save new IBANs from the settings page using this pref.
+  personal_data_manager_->SetAutofillHasSeenIban();
+
   bool found_existing_local_iban = base::ranges::any_of(
       personal_data_manager_->GetLocalIBANs(), [&](const auto& iban) {
         return iban->value() == candidate_iban.value();
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index c6630eaa..7f8a169d 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -245,13 +245,7 @@
   //   - NEW_CARD otherwise.
   absl::optional<CreditCard> ExtractCreditCard(const FormStructure& form);
 
-  // Returns the extracted IBAN from the `form` if applicable.
-  // This is the case if it is a new IBAN or a local IBAN.
-  //
-  // The function has one side-effect:
-  // - record_type of the returned IBAN is set to
-  //   - LOCAL_IBAN if a local IBAN matches;
-  //   - NEW_IBAN if no local IBAN matches
+  // Returns the extracted IBAN from the `form` if it is a new IBAN.
   absl::optional<IBAN> ExtractIBAN(const FormStructure& form);
 
   // Tries to initiate the saving of the `credit_card_import_candidate`
@@ -275,7 +269,7 @@
           address_profile_import_candidates,
       bool allow_prompt = true);
 
-  // Extracts the IBAN from the form structure.
+  // Helper function which extracts the IBAN from the form structure.
   IBAN ExtractIBANFromForm(const FormStructure& form);
 
   // Go through the `form` fields and find a UPI ID to extract. The return value
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index 20d8212..8174821b 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -3216,6 +3216,44 @@
   ASSERT_FALSE(extracted_data.iban_import_candidate);
 }
 
+TEST_P(FormDataImporterTest, ExtractFormData_SubmittingIbanFormUpdatesPref) {
+  // Simulate a form submission with a new IBAN.
+  FormData form;
+  form.url = GURL("https://www.foo.com");
+  // The pref should always start disabled.
+  ASSERT_FALSE(personal_data_manager_->IsAutofillHasSeenIbanPrefEnabled());
+
+  AddIBANForm(&form, kIbanValue);
+
+  FormStructure form_structure(form);
+  form_structure.DetermineHeuristicTypes(nullptr, nullptr);
+  ExtractFormDataAndProcessAddressCandidates(
+      form_structure, /*profile_autofill_enabled=*/true,
+      /*payment_methods_autofill_enabled=*/true);
+  if (base::FeatureList::IsEnabled(features::kAutofillFillIbanFields)) {
+    // Submitting the IBAN form permanently enables the pref.
+    EXPECT_TRUE(personal_data_manager_->IsAutofillHasSeenIbanPrefEnabled());
+  } else {
+    // With the IBAN feature disabled, its form submission is not detected, and
+    // the pref remains unchanged.
+    EXPECT_FALSE(personal_data_manager_->IsAutofillHasSeenIbanPrefEnabled());
+  }
+}
+
+TEST_P(FormDataImporterTest,
+       ExtractFormData_SubmittingCreditCardFormDoesNotUpdateIbanPref) {
+  ASSERT_FALSE(personal_data_manager_->IsAutofillHasSeenIbanPrefEnabled());
+  std::unique_ptr<FormStructure> form_structure =
+      ConstructDefaultCreditCardFormStructure();
+  ExtractFormDataAndProcessAddressCandidates(
+      *form_structure, /*profile_autofill_enabled=*/true,
+      /*payment_methods_autofill_enabled=*/true);
+
+  // Submitting the credit card form won't enable the pref, even if the flag is
+  // on.
+  EXPECT_FALSE(personal_data_manager_->IsAutofillHasSeenIbanPrefEnabled());
+}
+
 TEST_P(FormDataImporterTest,
        ExtractFormData_ImportIbanRecordType_IbanAutofill_NewIban) {
   // Simulate a form submission with a new IBAN.
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index 791fbff..89030c6 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -129,9 +129,10 @@
 class MockAutofillClient : public TestAutofillClient {
  public:
   explicit MockAutofillClient(
-      std::unique_ptr<TestPersonalDataManager> pdm = nullptr)
-      : TestAutofillClient(pdm ? std::move(pdm)
-                               : std::make_unique<TestPersonalDataManager>()) {}
+      std::unique_ptr<TestPersonalDataManager> pdm = nullptr) {
+    set_personal_data_manager(
+        pdm ? std::move(pdm) : std::make_unique<TestPersonalDataManager>());
+  }
   ~MockAutofillClient() override = default;
   MOCK_METHOD(VirtualCardEnrollmentManager*,
               GetVirtualCardEnrollmentManager,
diff --git a/components/autofill/core/browser/payments/iban_save_manager_unittest.cc b/components/autofill/core/browser/payments/iban_save_manager_unittest.cc
index fe707aae..65ec70e 100644
--- a/components/autofill/core/browser/payments/iban_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/iban_save_manager_unittest.cc
@@ -27,6 +27,8 @@
  public:
   IBANSaveManagerTest() {
     autofill_client_.SetPrefs(test::PrefServiceForTesting());
+    autofill_client_.set_personal_data_manager(
+        std::make_unique<TestPersonalDataManager>());
     std::unique_ptr<TestStrikeDatabase> test_strike_database =
         std::make_unique<TestStrikeDatabase>();
     strike_database_ = test_strike_database.get();
@@ -54,8 +56,7 @@
 
   base::test::TaskEnvironment task_environment_;
   test::AutofillEnvironment autofill_environment_;
-  TestAutofillClient autofill_client_{
-      std::make_unique<TestPersonalDataManager>()};
+  TestAutofillClient autofill_client_;
 
   std::unique_ptr<IBANSaveManager> iban_save_manager_;
   raw_ptr<TestStrikeDatabase> strike_database_;
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index dad9b34..2989a77 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -829,6 +829,14 @@
   if (!IsAutofillIBANEnabled())
     return std::string();
 
+  // Sets the `kAutofillHasSeenIban` pref to true indicating that the user has
+  // added an IBAN via Chrome payment settings page or accepted the save-IBAN
+  // prompt, which indicates that the user is familiar with IBANs as a concept.
+  // We set the pref so that even if the user travels to a country where IBAN
+  // functionality is not typically used, they will still be able to save new
+  // IBANs from the settings page using this pref.
+  SetAutofillHasSeenIban();
+
   // Early exit if `is_off_the_record_` is true, or an IBAN which has the same
   // guid exists in `local_ibans_`, or fail to get local database.
   if (is_off_the_record_ || FindByGUID(local_ibans_, iban.guid()) ||
@@ -1523,6 +1531,14 @@
   return prefs::IsAutofillCreditCardEnabled(pref_service_);
 }
 
+bool PersonalDataManager::IsAutofillHasSeenIbanPrefEnabled() const {
+  return prefs::HasSeenIban(pref_service_);
+}
+
+void PersonalDataManager::SetAutofillHasSeenIban() {
+  prefs::SetAutofillHasSeenIban(pref_service_);
+}
+
 bool PersonalDataManager::IsAutofillIBANEnabled() const {
   return prefs::IsAutofillIBANEnabled(pref_service_);
 }
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index adba601..4c4763d4 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -494,6 +494,12 @@
   // Returns the value of the AutofillCreditCardEnabled pref.
   virtual bool IsAutofillCreditCardEnabled() const;
 
+  // Returns the value of the kAutofillHasSeenIban pref.
+  bool IsAutofillHasSeenIbanPrefEnabled() const;
+
+  // Sets the value of the kAutofillHasSeenIban pref to true.
+  void SetAutofillHasSeenIban();
+
   // Returns the value of the AutofillIBANEnabled pref.
   virtual bool IsAutofillIBANEnabled() const;
 
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index af14c327f..b9ee243 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -915,6 +915,18 @@
   EXPECT_EQ(0U, personal_data_->GetLocalIBANs().size());
 }
 
+TEST_F(PersonalDataManagerTest, AddingIbanUpdatesPref) {
+  prefs::SetAutofillIBANEnabled(prefs_.get(), true);
+  // The pref should always start disabled.
+  ASSERT_FALSE(personal_data_->IsAutofillHasSeenIbanPrefEnabled());
+  IBAN iban = test::GetIBAN();
+
+  personal_data_->AddIBAN(iban);
+  WaitForOnPersonalDataChanged();
+  // Adding an IBAN permanently enables the pref.
+  EXPECT_TRUE(personal_data_->IsAutofillHasSeenIbanPrefEnabled());
+}
+
 TEST_F(PersonalDataManagerTest, AddUpdateRemoveIBANs) {
   prefs::SetAutofillIBANEnabled(prefs_.get(), true);
   IBAN iban0(base::GenerateGUID());
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
deleted file mode 100644
index 857d8a5..0000000
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ /dev/null
@@ -1,431 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/test_autofill_client.h"
-
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/metrics/autofill_metrics.h"
-#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
-#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
-#include "components/version_info/channel.h"
-
-#if !BUILDFLAG(IS_IOS)
-#include "components/autofill/core/browser/payments/test_internal_authenticator.h"
-#endif
-
-namespace autofill {
-
-TestAutofillClient::TestAutofillClient(
-    std::unique_ptr<TestPersonalDataManager> pdm)
-    : test_personal_data_manager_(
-          pdm ? std::move(pdm) : std::make_unique<TestPersonalDataManager>()),
-      form_origin_(GURL("https://example.test")),
-      last_committed_primary_main_frame_url_(GURL("https://example.test")),
-      log_manager_(LogManager::Create(&log_router_, base::NullCallback())) {
-  mock_iban_manager_ = std::make_unique<testing::NiceMock<MockIBANManager>>(
-      test_personal_data_manager_.get());
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch("show-autofill-internals"))
-    scoped_logging_subscription_.Observe(&log_router_);
-}
-
-TestAutofillClient::~TestAutofillClient() = default;
-
-version_info::Channel TestAutofillClient::GetChannel() const {
-  return channel_for_testing_;
-}
-
-bool TestAutofillClient::IsOffTheRecord() {
-  return is_off_the_record_;
-}
-
-AutofillDownloadManager* TestAutofillClient::GetDownloadManager() {
-  return download_manager_.get();
-}
-
-scoped_refptr<network::SharedURLLoaderFactory>
-TestAutofillClient::GetURLLoaderFactory() {
-  return test_shared_loader_factory_;
-}
-
-TestPersonalDataManager* TestAutofillClient::GetPersonalDataManager() {
-  return test_personal_data_manager_.get();
-}
-
-AutocompleteHistoryManager*
-TestAutofillClient::GetAutocompleteHistoryManager() {
-  return &mock_autocomplete_history_manager_;
-}
-
-IBANManager* TestAutofillClient::GetIBANManager() {
-  return mock_iban_manager_.get();
-}
-
-MerchantPromoCodeManager* TestAutofillClient::GetMerchantPromoCodeManager() {
-  return &mock_merchant_promo_code_manager_;
-}
-
-CreditCardCvcAuthenticator* TestAutofillClient::GetCvcAuthenticator() {
-  if (!cvc_authenticator_)
-    cvc_authenticator_ = std::make_unique<CreditCardCvcAuthenticator>(this);
-  return cvc_authenticator_.get();
-}
-
-CreditCardOtpAuthenticator* TestAutofillClient::GetOtpAuthenticator() {
-  if (!otp_authenticator_)
-    otp_authenticator_ = std::make_unique<CreditCardOtpAuthenticator>(this);
-  return otp_authenticator_.get();
-}
-
-PrefService* TestAutofillClient::GetPrefs() {
-  return const_cast<PrefService*>(std::as_const(*this).GetPrefs());
-}
-
-const PrefService* TestAutofillClient::GetPrefs() const {
-  return prefs_.get();
-}
-
-syncer::SyncService* TestAutofillClient::GetSyncService() {
-  return test_sync_service_;
-}
-
-signin::IdentityManager* TestAutofillClient::GetIdentityManager() {
-  return identity_test_env_.identity_manager();
-}
-
-FormDataImporter* TestAutofillClient::GetFormDataImporter() {
-  return form_data_importer_.get();
-}
-
-payments::PaymentsClient* TestAutofillClient::GetPaymentsClient() {
-  return payments_client_.get();
-}
-
-StrikeDatabase* TestAutofillClient::GetStrikeDatabase() {
-  return test_strike_database_.get();
-}
-
-ukm::UkmRecorder* TestAutofillClient::GetUkmRecorder() {
-  return &test_ukm_recorder_;
-}
-
-ukm::SourceId TestAutofillClient::GetUkmSourceId() {
-  if (source_id_ == -1) {
-    source_id_ = ukm::UkmRecorder::GetNewSourceID();
-    test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
-  }
-  return source_id_;
-}
-
-AddressNormalizer* TestAutofillClient::GetAddressNormalizer() {
-  return &test_address_normalizer_;
-}
-
-AutofillOfferManager* TestAutofillClient::GetAutofillOfferManager() {
-  return autofill_offer_manager_.get();
-}
-
-const GURL& TestAutofillClient::GetLastCommittedPrimaryMainFrameURL() const {
-  return last_committed_primary_main_frame_url_;
-}
-
-url::Origin TestAutofillClient::GetLastCommittedPrimaryMainFrameOrigin() const {
-  return url::Origin::Create(last_committed_primary_main_frame_url_);
-}
-
-security_state::SecurityLevel
-TestAutofillClient::GetSecurityLevelForUmaHistograms() {
-  return security_level_;
-}
-
-translate::LanguageState* TestAutofillClient::GetLanguageState() {
-  return &mock_translate_driver_.GetLanguageState();
-}
-
-translate::TranslateDriver* TestAutofillClient::GetTranslateDriver() {
-  return &mock_translate_driver_;
-}
-
-std::string TestAutofillClient::GetVariationConfigCountryCode() const {
-  return variation_config_country_code_;
-}
-
-#if !BUILDFLAG(IS_IOS)
-std::unique_ptr<webauthn::InternalAuthenticator>
-TestAutofillClient::CreateCreditCardInternalAuthenticator(
-    AutofillDriver* driver) {
-  return std::make_unique<TestInternalAuthenticator>();
-}
-#endif
-
-void TestAutofillClient::ShowAutofillSettings(PopupType popup_type) {}
-
-void TestAutofillClient::ShowUnmaskPrompt(
-    const autofill::CreditCard& card,
-    const autofill::CardUnmaskPromptOptions& card_unmask_prompt_options,
-    base::WeakPtr<autofill::CardUnmaskDelegate> delegate) {}
-
-void TestAutofillClient::OnUnmaskVerificationResult(PaymentsRpcResult result) {}
-
-VirtualCardEnrollmentManager*
-TestAutofillClient::GetVirtualCardEnrollmentManager() {
-  return form_data_importer_->GetVirtualCardEnrollmentManager();
-}
-
-void TestAutofillClient::ShowVirtualCardEnrollDialog(
-    const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
-    base::OnceClosure accept_virtual_card_callback,
-    base::OnceClosure decline_virtual_card_callback) {}
-
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
-std::vector<std::string>
-TestAutofillClient::GetAllowedMerchantsForVirtualCards() {
-  return allowed_merchants_;
-}
-
-std::vector<std::string>
-TestAutofillClient::GetAllowedBinRangesForVirtualCards() {
-  return allowed_bin_ranges_;
-}
-
-void TestAutofillClient::ShowLocalCardMigrationDialog(
-    base::OnceClosure show_migration_dialog_closure) {
-  std::move(show_migration_dialog_closure).Run();
-}
-
-void TestAutofillClient::ConfirmMigrateLocalCardToCloud(
-    const LegalMessageLines& legal_message_lines,
-    const std::string& user_email,
-    const std::vector<MigratableCreditCard>& migratable_credit_cards,
-    LocalCardMigrationCallback start_migrating_cards_callback) {
-  // If |migration_card_selection_| hasn't been preset by tests, default to
-  // selecting all migratable cards.
-  if (migration_card_selection_.empty()) {
-    for (MigratableCreditCard card : migratable_credit_cards)
-      migration_card_selection_.push_back(card.credit_card().guid());
-  }
-  std::move(start_migrating_cards_callback).Run(migration_card_selection_);
-}
-
-void TestAutofillClient::ShowLocalCardMigrationResults(
-    const bool has_server_error,
-    const std::u16string& tip_message,
-    const std::vector<MigratableCreditCard>& migratable_credit_cards,
-    MigrationDeleteCardCallback delete_local_card_callback) {}
-
-void TestAutofillClient::ConfirmSaveIBANLocally(
-    const IBAN& iban,
-    bool should_show_prompt,
-    LocalSaveIBANPromptCallback callback) {
-  confirm_save_iban_locally_called_ = true;
-  offer_to_save_iban_bubble_was_shown_ = should_show_prompt;
-}
-
-void TestAutofillClient::ShowWebauthnOfferDialog(
-    WebauthnDialogCallback offer_dialog_callback) {}
-
-void TestAutofillClient::ShowWebauthnVerifyPendingDialog(
-    WebauthnDialogCallback verify_pending_dialog_callback) {}
-
-void TestAutofillClient::UpdateWebauthnOfferDialogWithError() {}
-
-bool TestAutofillClient::CloseWebauthnDialog() {
-  return true;
-}
-
-void TestAutofillClient::ConfirmSaveUpiIdLocally(
-    const std::string& upi_id,
-    base::OnceCallback<void(bool accept)> callback) {}
-
-void TestAutofillClient::OfferVirtualCardOptions(
-    const std::vector<CreditCard*>& candidates,
-    base::OnceCallback<void(const std::string&)> callback) {}
-
-#else  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
-void TestAutofillClient::ConfirmAccountNameFixFlow(
-    base::OnceCallback<void(const std::u16string&)> callback) {
-  credit_card_name_fix_flow_bubble_was_shown_ = true;
-  std::move(callback).Run(std::u16string(u"Gaia Name"));
-}
-
-void TestAutofillClient::ConfirmExpirationDateFixFlow(
-    const CreditCard& card,
-    base::OnceCallback<void(const std::u16string&, const std::u16string&)>
-        callback) {
-  credit_card_name_fix_flow_bubble_was_shown_ = true;
-  std::move(callback).Run(
-      std::u16string(u"03"),
-      std::u16string(base::ASCIIToUTF16(test::NextYear().c_str())));
-}
-#endif
-
-void TestAutofillClient::ConfirmSaveCreditCardLocally(
-    const CreditCard& card,
-    SaveCreditCardOptions options,
-    LocalSaveCardPromptCallback callback) {
-  confirm_save_credit_card_locally_called_ = true;
-  offer_to_save_credit_card_bubble_was_shown_ = options.show_prompt;
-  save_credit_card_options_ = options;
-  std::move(callback).Run(AutofillClient::SaveCardOfferUserDecision::kAccepted);
-}
-
-void TestAutofillClient::ConfirmSaveCreditCardToCloud(
-    const CreditCard& card,
-    const LegalMessageLines& legal_message_lines,
-    SaveCreditCardOptions options,
-    UploadSaveCardPromptCallback callback) {
-  offer_to_save_credit_card_bubble_was_shown_ = options.show_prompt;
-  save_credit_card_options_ = options;
-  std::move(callback).Run(AutofillClient::SaveCardOfferUserDecision::kAccepted,
-                          {});
-}
-
-void TestAutofillClient::CreditCardUploadCompleted(bool card_saved) {}
-
-void TestAutofillClient::ConfirmCreditCardFillAssist(
-    const CreditCard& card,
-    base::OnceClosure callback) {
-  std::move(callback).Run();
-}
-
-void TestAutofillClient::ConfirmSaveAddressProfile(
-    const AutofillProfile& profile,
-    const AutofillProfile* original_profile,
-    SaveAddressProfilePromptOptions options,
-    AddressProfileSavePromptCallback callback) {}
-
-bool TestAutofillClient::HasCreditCardScanFeature() {
-  return false;
-}
-
-void TestAutofillClient::ScanCreditCard(CreditCardScanCallback callback) {}
-
-bool TestAutofillClient::TryToShowFastCheckout(
-    const FormData& form,
-    const FormFieldData& field,
-    base::WeakPtr<AutofillManager> autofill_manager) {
-  return false;
-}
-
-void TestAutofillClient::HideFastCheckout(bool allow_further_runs) {}
-
-bool TestAutofillClient::IsFastCheckoutSupported() {
-  return false;
-}
-
-bool TestAutofillClient::IsShowingFastCheckoutUI() {
-  return false;
-}
-
-bool TestAutofillClient::IsTouchToFillCreditCardSupported() {
-  return false;
-}
-
-bool TestAutofillClient::ShowTouchToFillCreditCard(
-    base::WeakPtr<TouchToFillDelegate> delegate,
-    base::span<const autofill::CreditCard* const> cards_to_suggest) {
-  return false;
-}
-
-void TestAutofillClient::HideTouchToFillCreditCard() {}
-
-void TestAutofillClient::ShowAutofillPopup(
-    const AutofillClient::PopupOpenArgs& open_args,
-    base::WeakPtr<AutofillPopupDelegate> delegate) {}
-
-void TestAutofillClient::UpdateAutofillPopupDataListValues(
-    const std::vector<std::u16string>& values,
-    const std::vector<std::u16string>& labels) {}
-
-std::vector<Suggestion> TestAutofillClient::GetPopupSuggestions() const {
-  return {};
-}
-
-void TestAutofillClient::PinPopupView() {}
-
-AutofillClient::PopupOpenArgs TestAutofillClient::GetReopenPopupArgs() const {
-  return {};
-}
-
-void TestAutofillClient::UpdatePopup(const std::vector<Suggestion>& suggestions,
-                                     PopupType popup_type) {}
-
-void TestAutofillClient::HideAutofillPopup(PopupHidingReason reason) {}
-
-void TestAutofillClient::ShowVirtualCardErrorDialog(
-    const AutofillErrorDialogContext& context) {
-  virtual_card_error_dialog_shown_ = true;
-  autofill_error_dialog_context_ = context;
-}
-
-bool TestAutofillClient::IsAutocompleteEnabled() const {
-  return true;
-}
-
-bool TestAutofillClient::IsPasswordManagerEnabled() {
-  return true;
-}
-
-void TestAutofillClient::PropagateAutofillPredictions(
-    AutofillDriver* driver,
-    const std::vector<FormStructure*>& forms) {}
-
-void TestAutofillClient::DidFillOrPreviewField(
-    const std::u16string& autofilled_value,
-    const std::u16string& profile_full_name) {}
-
-bool TestAutofillClient::IsContextSecure() const {
-  // Simplified secure context check for tests.
-  return form_origin_.SchemeIs("https");
-}
-
-void TestAutofillClient::ExecuteCommand(int id) {}
-
-void TestAutofillClient::OpenPromoCodeOfferDetailsURL(const GURL& url) {}
-
-LogManager* TestAutofillClient::GetLogManager() const {
-  return log_manager_.get();
-}
-
-FormInteractionsFlowId TestAutofillClient::GetCurrentFormInteractionsFlowId() {
-  return {};
-}
-
-void TestAutofillClient::LoadRiskData(
-    base::OnceCallback<void(const std::string&)> callback) {
-  std::move(callback).Run("some risk data");
-}
-
-#if BUILDFLAG(IS_IOS)
-bool TestAutofillClient::IsLastQueriedField(FieldGlobalId field_id) {
-  return true;
-}
-#endif
-
-void TestAutofillClient::InitializeUKMSources() {
-  test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
-}
-
-void TestAutofillClient::set_form_origin(const GURL& url) {
-  form_origin_ = url;
-  // Also reset source_id_.
-  source_id_ = ukm::UkmRecorder::GetNewSourceID();
-  test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
-}
-
-void TestAutofillClient::set_last_committed_primary_main_frame_url(
-    const GURL& url) {
-  last_committed_primary_main_frame_url_ = url;
-}
-
-ukm::TestUkmRecorder* TestAutofillClient::GetTestUkmRecorder() {
-  return &test_ukm_recorder_;
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index 7265263f..cbdc2442 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -7,18 +7,23 @@
 
 #include <memory>
 #include <string>
+#include <type_traits>
 #include <utility>
 #include <vector>
 
+#include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/i18n/rtl.h"
 #include "base/scoped_observation.h"
+#include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_download_manager.h"
+#include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/logging/log_router.h"
 #include "components/autofill/core/browser/logging/text_log_receiver.h"
+#include "components/autofill/core/browser/metrics/autofill_metrics.h"
 #include "components/autofill/core/browser/mock_autocomplete_history_manager.h"
 #include "components/autofill/core/browser/mock_iban_manager.h"
 #include "components/autofill/core/browser/mock_merchant_promo_code_manager.h"
@@ -27,6 +32,7 @@
 #include "components/autofill/core/browser/payments/credit_card_cvc_authenticator.h"
 #include "components/autofill/core/browser/payments/credit_card_otp_authenticator.h"
 #include "components/autofill/core/browser/payments/legal_message_line.h"
+#include "components/autofill/core/browser/payments/local_card_migration_manager.h"
 #include "components/autofill/core/browser/payments/test_payments_client.h"
 #include "components/autofill/core/browser/strike_databases/payments/test_strike_database.h"
 #include "components/autofill/core/browser/test_address_normalizer.h"
@@ -34,6 +40,7 @@
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/autofill/core/browser/ui/payments/card_unmask_prompt_options.h"
 #include "components/autofill/core/browser/ui/popup_types.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "components/translate/core/browser/language_state.h"
@@ -45,182 +52,391 @@
 #include "services/network/test/test_url_loader_factory.h"
 
 #if !BUILDFLAG(IS_IOS)
+#include "components/autofill/core/browser/payments/test_internal_authenticator.h"
 #include "components/webauthn/core/browser/internal_authenticator.h"
 #endif
 
 namespace autofill {
 
-// This class is for easier writing of tests.
+// This class is for easier writing of tests. There are two instances of the
+// template:
+//
+// - TestAutofillClient is a simple AutofillClient;
+// - TestContentAutofillClient is a ContentAutofillClient, i.e., is associated
+//   to a content::WebContents and has a ContentAutofillDriverFactory
+//
+// As a rule of thumb, TestContentAutofillClient is preferable in tests that
+// have a content::WebContents.
 //
 // If you pass the command-line flag --show-autofill-internals,
 // autofill-internals logs are recorded to LOG(INFO).
-class TestAutofillClient : public AutofillClient {
+template <typename T>
+class TestAutofillClientTemplate : public T {
  public:
-  explicit TestAutofillClient(
-      std::unique_ptr<TestPersonalDataManager> pdm = nullptr);
+  static_assert(std::is_same_v<AutofillClient, T> ||
+                std::is_base_of_v<AutofillClient, T>);
 
-  TestAutofillClient(const TestAutofillClient&) = delete;
-  TestAutofillClient& operator=(const TestAutofillClient&) = delete;
-
-  ~TestAutofillClient() override;
-
-  // AutofillClient:
-  version_info::Channel GetChannel() const override;
-  scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
-  bool IsOffTheRecord() override;
-  AutofillDownloadManager* GetDownloadManager() override;
-  TestPersonalDataManager* GetPersonalDataManager() override;
-  AutocompleteHistoryManager* GetAutocompleteHistoryManager() override;
-  IBANManager* GetIBANManager() override;
-  MerchantPromoCodeManager* GetMerchantPromoCodeManager() override;
-  CreditCardCvcAuthenticator* GetCvcAuthenticator() override;
-  CreditCardOtpAuthenticator* GetOtpAuthenticator() override;
-  PrefService* GetPrefs() override;
-  const PrefService* GetPrefs() const override;
-  syncer::SyncService* GetSyncService() override;
-  signin::IdentityManager* GetIdentityManager() override;
-  FormDataImporter* GetFormDataImporter() override;
-  payments::PaymentsClient* GetPaymentsClient() override;
-  StrikeDatabase* GetStrikeDatabase() override;
-  ukm::UkmRecorder* GetUkmRecorder() override;
-  ukm::SourceId GetUkmSourceId() override;
-  AddressNormalizer* GetAddressNormalizer() override;
-  AutofillOfferManager* GetAutofillOfferManager() override;
-  const GURL& GetLastCommittedPrimaryMainFrameURL() const override;
-  url::Origin GetLastCommittedPrimaryMainFrameOrigin() const override;
-  security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  translate::LanguageState* GetLanguageState() override;
-  translate::TranslateDriver* GetTranslateDriver() override;
-  std::string GetVariationConfigCountryCode() const override;
-#if !BUILDFLAG(IS_IOS)
-  std::unique_ptr<webauthn::InternalAuthenticator>
-  CreateCreditCardInternalAuthenticator(AutofillDriver* driver) override;
-#endif
-
-  void ShowAutofillSettings(PopupType popup_type) override;
-  void ShowUnmaskPrompt(
-      const autofill::CreditCard& card,
-      const autofill::CardUnmaskPromptOptions& card_unmask_prompt_options,
-      base::WeakPtr<autofill::CardUnmaskDelegate> delegate) override;
-  void OnUnmaskVerificationResult(PaymentsRpcResult result) override;
-  VirtualCardEnrollmentManager* GetVirtualCardEnrollmentManager() override;
-  void ShowVirtualCardEnrollDialog(
-      const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
-      base::OnceClosure accept_virtual_card_callback,
-      base::OnceClosure decline_virtual_card_callback) override;
-#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
-  std::vector<std::string> GetAllowedMerchantsForVirtualCards() override;
-  std::vector<std::string> GetAllowedBinRangesForVirtualCards() override;
-
-  void ShowLocalCardMigrationDialog(
-      base::OnceClosure show_migration_dialog_closure) override;
-  void ConfirmMigrateLocalCardToCloud(
-      const LegalMessageLines& legal_message_lines,
-      const std::string& user_email,
-      const std::vector<MigratableCreditCard>& migratable_credit_cards,
-      LocalCardMigrationCallback start_migrating_cards_callback) override;
-  void ShowLocalCardMigrationResults(
-      const bool has_server_error,
-      const std::u16string& tip_message,
-      const std::vector<MigratableCreditCard>& migratable_credit_cards,
-      MigrationDeleteCardCallback delete_local_card_callback) override;
-  void ConfirmSaveIBANLocally(const IBAN& iban,
-                              bool should_show_prompt,
-                              LocalSaveIBANPromptCallback callback) override;
-  void ShowWebauthnOfferDialog(
-      WebauthnDialogCallback offer_dialog_callback) override;
-  void ShowWebauthnVerifyPendingDialog(
-      WebauthnDialogCallback verify_pending_dialog_callback) override;
-  void UpdateWebauthnOfferDialogWithError() override;
-  bool CloseWebauthnDialog() override;
-  void ConfirmSaveUpiIdLocally(
-      const std::string& upi_id,
-      base::OnceCallback<void(bool accept)> callback) override;
-  void OfferVirtualCardOptions(
-      const std::vector<CreditCard*>& candidates,
-      base::OnceCallback<void(const std::string&)> callback) override;
-#else  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
-  void ConfirmAccountNameFixFlow(
-      base::OnceCallback<void(const std::u16string&)> callback) override;
-  void ConfirmExpirationDateFixFlow(
-      const CreditCard& card,
-      base::OnceCallback<void(const std::u16string&, const std::u16string&)>
-          callback) override;
-#endif
-  void ConfirmSaveCreditCardLocally(
-      const CreditCard& card,
-      SaveCreditCardOptions options,
-      LocalSaveCardPromptCallback callback) override;
-
-  void ConfirmSaveCreditCardToCloud(
-      const CreditCard& card,
-      const LegalMessageLines& legal_message_lines,
-      SaveCreditCardOptions options,
-      UploadSaveCardPromptCallback callback) override;
-  void CreditCardUploadCompleted(bool card_saved) override;
-  void ConfirmCreditCardFillAssist(const CreditCard& card,
-                                   base::OnceClosure callback) override;
-  void ConfirmSaveAddressProfile(
-      const AutofillProfile& profile,
-      const AutofillProfile* original_profile,
-      SaveAddressProfilePromptOptions options,
-      AddressProfileSavePromptCallback callback) override;
-  bool HasCreditCardScanFeature() override;
-  void ScanCreditCard(CreditCardScanCallback callback) override;
-  bool TryToShowFastCheckout(
-      const FormData& form,
-      const FormFieldData& field,
-      base::WeakPtr<AutofillManager> autofill_manager) override;
-  void HideFastCheckout(bool allow_further_runs) override;
-  bool IsFastCheckoutSupported() override;
-  bool IsShowingFastCheckoutUI() override;
-  bool IsTouchToFillCreditCardSupported() override;
-  bool ShowTouchToFillCreditCard(
-      base::WeakPtr<TouchToFillDelegate> delegate,
-      base::span<const autofill::CreditCard* const> cards_to_suggest) override;
-  void HideTouchToFillCreditCard() override;
-  void ShowAutofillPopup(
-      const AutofillClient::PopupOpenArgs& open_args,
-      base::WeakPtr<AutofillPopupDelegate> delegate) override;
-  void UpdateAutofillPopupDataListValues(
-      const std::vector<std::u16string>& values,
-      const std::vector<std::u16string>& labels) override;
-  std::vector<Suggestion> GetPopupSuggestions() const override;
-  void PinPopupView() override;
-  AutofillClient::PopupOpenArgs GetReopenPopupArgs() const override;
-  void UpdatePopup(const std::vector<Suggestion>& suggestions,
-                   PopupType popup_type) override;
-  void HideAutofillPopup(PopupHidingReason reason) override;
-  void ShowVirtualCardErrorDialog(
-      const AutofillErrorDialogContext& context) override;
-  bool IsAutocompleteEnabled() const override;
-  bool IsPasswordManagerEnabled() override;
-  void PropagateAutofillPredictions(
-      AutofillDriver* driver,
-      const std::vector<FormStructure*>& forms) override;
-  void DidFillOrPreviewField(const std::u16string& autofilled_value,
-                             const std::u16string& profile_full_name) override;
-  // By default, TestAutofillClient will report that the context is
-  // secure. This can be adjusted by calling set_form_origin() with an
-  // http:// URL.
-  bool IsContextSecure() const override;
-  void ExecuteCommand(int id) override;
-  void OpenPromoCodeOfferDetailsURL(const GURL& url) override;
-  LogManager* GetLogManager() const override;
-  FormInteractionsFlowId GetCurrentFormInteractionsFlowId() override;
-
-  // RiskDataLoader:
-  void LoadRiskData(
-      base::OnceCallback<void(const std::string&)> callback) override;
-
-#if BUILDFLAG(IS_IOS)
-  bool IsLastQueriedField(FieldGlobalId field_id) override;
-#endif
+  using T::T;
+  TestAutofillClientTemplate(const TestAutofillClientTemplate&) = delete;
+  TestAutofillClientTemplate& operator=(const TestAutofillClientTemplate&) =
+      delete;
+  ~TestAutofillClientTemplate() override = default;
 
   // Initializes UKM source from form_origin_. This needs to be called
   // in unittests after calling Purge for ukm recorder to re-initialize
   // sources.
-  void InitializeUKMSources();
+  void InitializeUKMSources() {
+    test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
+  }
+
+  version_info::Channel GetChannel() const override {
+    return channel_for_testing_;
+  }
+
+  bool IsOffTheRecord() override { return is_off_the_record_; }
+
+  AutofillDownloadManager* GetDownloadManager() override {
+    return download_manager_.get();
+  }
+
+  scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory()
+      override {
+    return test_shared_loader_factory_;
+  }
+
+  TestPersonalDataManager* GetPersonalDataManager() override {
+    if (!test_personal_data_manager_) {
+      test_personal_data_manager_ = std::make_unique<TestPersonalDataManager>();
+    }
+    return test_personal_data_manager_.get();
+  }
+
+  AutocompleteHistoryManager* GetAutocompleteHistoryManager() override {
+    return &mock_autocomplete_history_manager_;
+  }
+
+  IBANManager* GetIBANManager() override { return GetMockIBANManager(); }
+
+  MerchantPromoCodeManager* GetMerchantPromoCodeManager() override {
+    return &mock_merchant_promo_code_manager_;
+  }
+
+  CreditCardCvcAuthenticator* GetCvcAuthenticator() override {
+    if (!cvc_authenticator_) {
+      cvc_authenticator_ = std::make_unique<CreditCardCvcAuthenticator>(this);
+    }
+    return cvc_authenticator_.get();
+  }
+
+  CreditCardOtpAuthenticator* GetOtpAuthenticator() override {
+    if (!otp_authenticator_) {
+      otp_authenticator_ = std::make_unique<CreditCardOtpAuthenticator>(this);
+    }
+    return otp_authenticator_.get();
+  }
+
+  PrefService* GetPrefs() override {
+    return const_cast<PrefService*>(std::as_const(*this).GetPrefs());
+  }
+
+  const PrefService* GetPrefs() const override { return prefs_.get(); }
+
+  syncer::SyncService* GetSyncService() override { return test_sync_service_; }
+
+  signin::IdentityManager* GetIdentityManager() override {
+    return identity_test_env_.identity_manager();
+  }
+
+  FormDataImporter* GetFormDataImporter() override {
+    return form_data_importer_.get();
+  }
+
+  payments::PaymentsClient* GetPaymentsClient() override {
+    return payments_client_.get();
+  }
+
+  StrikeDatabase* GetStrikeDatabase() override {
+    return test_strike_database_.get();
+  }
+
+  ukm::UkmRecorder* GetUkmRecorder() override { return &test_ukm_recorder_; }
+
+  ukm::SourceId GetUkmSourceId() override {
+    if (source_id_ == -1) {
+      source_id_ = ukm::UkmRecorder::GetNewSourceID();
+      test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
+    }
+    return source_id_;
+  }
+
+  AddressNormalizer* GetAddressNormalizer() override {
+    return &test_address_normalizer_;
+  }
+
+  AutofillOfferManager* GetAutofillOfferManager() override {
+    return autofill_offer_manager_.get();
+  }
+
+  const GURL& GetLastCommittedPrimaryMainFrameURL() const override {
+    return last_committed_primary_main_frame_url_;
+  }
+
+  url::Origin GetLastCommittedPrimaryMainFrameOrigin() const override {
+    return url::Origin::Create(last_committed_primary_main_frame_url_);
+  }
+
+  security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override {
+    return security_level_;
+  }
+
+  translate::LanguageState* GetLanguageState() override {
+    return &mock_translate_driver_.GetLanguageState();
+  }
+
+  translate::TranslateDriver* GetTranslateDriver() override {
+    return &mock_translate_driver_;
+  }
+
+  std::string GetVariationConfigCountryCode() const override {
+    return variation_config_country_code_;
+  }
+
+#if !BUILDFLAG(IS_IOS)
+  std::unique_ptr<webauthn::InternalAuthenticator>
+  CreateCreditCardInternalAuthenticator(AutofillDriver* driver) override {
+    return std::make_unique<TestInternalAuthenticator>();
+  }
+#endif
+
+  void ShowAutofillSettings(PopupType popup_type) override {}
+
+  void ShowUnmaskPrompt(
+      const autofill::CreditCard& card,
+      const autofill::CardUnmaskPromptOptions& card_unmask_prompt_options,
+      base::WeakPtr<autofill::CardUnmaskDelegate> delegate) override {}
+
+  void OnUnmaskVerificationResult(
+      AutofillClient::PaymentsRpcResult result) override {}
+
+  VirtualCardEnrollmentManager* GetVirtualCardEnrollmentManager() override {
+    return form_data_importer_->GetVirtualCardEnrollmentManager();
+  }
+
+  void ShowVirtualCardEnrollDialog(
+      const VirtualCardEnrollmentFields& virtual_card_enrollment_fields,
+      base::OnceClosure accept_virtual_card_callback,
+      base::OnceClosure decline_virtual_card_callback) override {}
+
+#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
+
+  std::vector<std::string> GetAllowedMerchantsForVirtualCards() override {
+    return allowed_merchants_;
+  }
+
+  std::vector<std::string> GetAllowedBinRangesForVirtualCards() override {
+    return allowed_bin_ranges_;
+  }
+
+  void ShowLocalCardMigrationDialog(
+      base::OnceClosure show_migration_dialog_closure) override {
+    std::move(show_migration_dialog_closure).Run();
+  }
+
+  void ConfirmMigrateLocalCardToCloud(
+      const LegalMessageLines& legal_message_lines,
+      const std::string& user_email,
+      const std::vector<MigratableCreditCard>& migratable_credit_cards,
+      AutofillClient::LocalCardMigrationCallback start_migrating_cards_callback)
+      override {
+    // If |migration_card_selection_| hasn't been preset by tests, default to
+    // selecting all migratable cards.
+    if (migration_card_selection_.empty()) {
+      for (MigratableCreditCard card : migratable_credit_cards) {
+        migration_card_selection_.push_back(card.credit_card().guid());
+      }
+    }
+    std::move(start_migrating_cards_callback).Run(migration_card_selection_);
+  }
+
+  void ShowLocalCardMigrationResults(
+      const bool has_server_error,
+      const std::u16string& tip_message,
+      const std::vector<MigratableCreditCard>& migratable_credit_cards,
+      AutofillClient::MigrationDeleteCardCallback delete_local_card_callback)
+      override {}
+
+  void ConfirmSaveIBANLocally(
+      const IBAN& iban,
+      bool should_show_prompt,
+      AutofillClient::LocalSaveIBANPromptCallback callback) override {
+    confirm_save_iban_locally_called_ = true;
+    offer_to_save_iban_bubble_was_shown_ = should_show_prompt;
+  }
+
+  void ShowWebauthnOfferDialog(
+      AutofillClient::WebauthnDialogCallback offer_dialog_callback) override {}
+
+  void ShowWebauthnVerifyPendingDialog(
+      AutofillClient::WebauthnDialogCallback verify_pending_dialog_callback)
+      override {}
+
+  void UpdateWebauthnOfferDialogWithError() override {}
+
+  bool CloseWebauthnDialog() override { return true; }
+
+  void ConfirmSaveUpiIdLocally(
+      const std::string& upi_id,
+      base::OnceCallback<void(bool accept)> callback) override {}
+
+  void OfferVirtualCardOptions(
+      const std::vector<CreditCard*>& candidates,
+      base::OnceCallback<void(const std::string&)> callback) override {}
+
+#else  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
+
+  void ConfirmAccountNameFixFlow(
+      base::OnceCallback<void(const std::u16string&)> callback) override {
+    credit_card_name_fix_flow_bubble_was_shown_ = true;
+    std::move(callback).Run(std::u16string(u"Gaia Name"));
+  }
+
+  void ConfirmExpirationDateFixFlow(
+      const CreditCard& card,
+      base::OnceCallback<void(const std::u16string&, const std::u16string&)>
+          callback) override {
+    credit_card_name_fix_flow_bubble_was_shown_ = true;
+    std::move(callback).Run(
+        std::u16string(u"03"),
+        std::u16string(base::ASCIIToUTF16(test::NextYear().c_str())));
+  }
+
+#endif
+
+  void ConfirmSaveCreditCardLocally(
+      const CreditCard& card,
+      AutofillClient::SaveCreditCardOptions options,
+      AutofillClient::LocalSaveCardPromptCallback callback) override {
+    confirm_save_credit_card_locally_called_ = true;
+    offer_to_save_credit_card_bubble_was_shown_ = options.show_prompt;
+    save_credit_card_options_ = options;
+    std::move(callback).Run(
+        AutofillClient::SaveCardOfferUserDecision::kAccepted);
+  }
+
+  void ConfirmSaveCreditCardToCloud(
+      const CreditCard& card,
+      const LegalMessageLines& legal_message_lines,
+      AutofillClient::SaveCreditCardOptions options,
+      AutofillClient::UploadSaveCardPromptCallback callback) override {
+    offer_to_save_credit_card_bubble_was_shown_ = options.show_prompt;
+    save_credit_card_options_ = options;
+    std::move(callback).Run(
+        AutofillClient::SaveCardOfferUserDecision::kAccepted, {});
+  }
+
+  void CreditCardUploadCompleted(bool card_saved) override {}
+
+  void ConfirmCreditCardFillAssist(const CreditCard& card,
+                                   base::OnceClosure callback) override {
+    std::move(callback).Run();
+  }
+
+  void ConfirmSaveAddressProfile(
+      const AutofillProfile& profile,
+      const AutofillProfile* original_profile,
+      AutofillClient::SaveAddressProfilePromptOptions options,
+      AutofillClient::AddressProfileSavePromptCallback callback) override {}
+
+  bool HasCreditCardScanFeature() override { return false; }
+
+  void ScanCreditCard(
+      AutofillClient::CreditCardScanCallback callback) override {}
+
+  bool TryToShowFastCheckout(
+      const FormData& form,
+      const FormFieldData& field,
+      base::WeakPtr<AutofillManager> autofill_manager) override {
+    return false;
+  }
+
+  void HideFastCheckout(bool allow_further_runs) override {}
+
+  bool IsFastCheckoutSupported() override { return false; }
+
+  bool IsShowingFastCheckoutUI() override { return false; }
+
+  bool IsTouchToFillCreditCardSupported() override { return false; }
+
+  bool ShowTouchToFillCreditCard(
+      base::WeakPtr<TouchToFillDelegate> delegate,
+      base::span<const autofill::CreditCard* const> cards_to_suggest) override {
+    return false;
+  }
+
+  void HideTouchToFillCreditCard() override {}
+
+  void ShowAutofillPopup(
+      const AutofillClient::PopupOpenArgs& open_args,
+      base::WeakPtr<AutofillPopupDelegate> delegate) override {}
+
+  void UpdateAutofillPopupDataListValues(
+      const std::vector<std::u16string>& values,
+      const std::vector<std::u16string>& labels) override {}
+
+  std::vector<Suggestion> GetPopupSuggestions() const override { return {}; }
+
+  void PinPopupView() override {}
+
+  AutofillClient::PopupOpenArgs GetReopenPopupArgs() const override {
+    return {};
+  }
+
+  void UpdatePopup(const std::vector<Suggestion>& suggestions,
+                   PopupType popup_type) override {}
+
+  void HideAutofillPopup(PopupHidingReason reason) override {}
+
+  void ShowVirtualCardErrorDialog(
+      const AutofillErrorDialogContext& context) override {
+    virtual_card_error_dialog_shown_ = true;
+    autofill_error_dialog_context_ = context;
+  }
+
+  bool IsAutocompleteEnabled() const override { return true; }
+
+  bool IsPasswordManagerEnabled() override { return true; }
+
+  void PropagateAutofillPredictions(
+      AutofillDriver* driver,
+      const std::vector<FormStructure*>& forms) override {}
+
+  void DidFillOrPreviewField(const std::u16string& autofilled_value,
+                             const std::u16string& profile_full_name) override {
+  }
+
+  bool IsContextSecure() const override {
+    // Simplified secure context check for tests.
+    return form_origin_.SchemeIs("https");
+  }
+
+  void ExecuteCommand(int id) override {}
+
+  void OpenPromoCodeOfferDetailsURL(const GURL& url) override {}
+
+  LogManager* GetLogManager() const override { return log_manager_.get(); }
+
+  FormInteractionsFlowId GetCurrentFormInteractionsFlowId() override {
+    return {};
+  }
+
+  void LoadRiskData(
+      base::OnceCallback<void(const std::string&)> callback) override {
+    std::move(callback).Run("some risk data");
+  }
+
+#if BUILDFLAG(IS_IOS)
+  bool IsLastQueriedField(FieldGlobalId field_id) override { return true; }
+#endif
 
   void SetPrefs(std::unique_ptr<PrefService> prefs) {
     prefs_ = std::move(prefs);
@@ -255,7 +471,12 @@
     form_data_importer_ = std::move(form_data_importer);
   }
 
-  void set_form_origin(const GURL& url);
+  void set_form_origin(const GURL& url) {
+    form_origin_ = url;
+    // Also reset source_id_.
+    source_id_ = ukm::UkmRecorder::GetNewSourceID();
+    test_ukm_recorder_.UpdateSourceURL(source_id_, form_origin_);
+  }
 
   void set_sync_service(syncer::SyncService* test_sync_service) {
     test_sync_service_ = test_sync_service;
@@ -265,7 +486,9 @@
     security_level_ = security_level;
   }
 
-  void set_last_committed_primary_main_frame_url(const GURL& url);
+  void set_last_committed_primary_main_frame_url(const GURL& url) {
+    last_committed_primary_main_frame_url_ = url;
+  }
 
   void SetVariationConfigCountryCode(
       const std::string& variation_config_country_code) {
@@ -327,7 +550,7 @@
     return autofill_error_dialog_context_;
   }
 
-  SaveCreditCardOptions get_save_credit_card_options() {
+  AutofillClient::SaveCreditCardOptions get_save_credit_card_options() {
     return save_credit_card_options_.value();
   }
 
@@ -337,6 +560,10 @@
   }
 
   ::testing::NiceMock<MockIBANManager>* GetMockIBANManager() {
+    if (!mock_iban_manager_) {
+      mock_iban_manager_ = std::make_unique<testing::NiceMock<MockIBANManager>>(
+          test_personal_data_manager_.get());
+    }
     return mock_iban_manager_.get();
   }
 
@@ -375,7 +602,7 @@
 
   GURL form_origin() { return form_origin_; }
 
-  ukm::TestUkmRecorder* GetTestUkmRecorder();
+  ukm::TestUkmRecorder* GetTestUkmRecorder() { return &test_ukm_recorder_; }
 
  private:
   ukm::TestAutoSetUkmRecorder test_ukm_recorder_;
@@ -402,7 +629,7 @@
   std::unique_ptr<AutofillOfferManager> autofill_offer_manager_;
   std::unique_ptr<FormDataImporter> form_data_importer_;
 
-  GURL form_origin_;
+  GURL form_origin_{"https://example.test"};
   ukm::SourceId source_id_ = -1;
   std::string variation_config_country_code_;
 
@@ -445,7 +672,8 @@
   std::unique_ptr<AutofillDownloadManager> download_manager_;
 
   // Populated if credit card local save or upload was offered.
-  absl::optional<SaveCreditCardOptions> save_credit_card_options_;
+  absl::optional<AutofillClient::SaveCreditCardOptions>
+      save_credit_card_options_;
 
   // Populated if IBAN save was offered. True if bubble was shown, false
   // otherwise.
@@ -458,20 +686,38 @@
 
   // The last URL submitted in the primary main frame by the user. Set in the
   // constructor.
-  GURL last_committed_primary_main_frame_url_;
+  GURL last_committed_primary_main_frame_url_{"https://example.test"};
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   std::vector<std::string> allowed_merchants_;
   std::vector<std::string> allowed_bin_ranges_;
 #endif
 
+  struct ScopedLogRouterObservation {
+    explicit ScopedLogRouterObservation(LogRouter* log_router,
+                                        TextLogReceiver* receiver)
+        : scoped_logging_subscription_(receiver) {
+      base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+      if (command_line->HasSwitch("show-autofill-internals")) {
+        scoped_logging_subscription_.Observe(log_router);
+      }
+    }
+    base::ScopedObservation<LogRouter, LogReceiver>
+        scoped_logging_subscription_;
+  };
+
   LogRouter log_router_;
-  std::unique_ptr<LogManager> log_manager_;
+  std::unique_ptr<LogManager> log_manager_ =
+      LogManager::Create(&log_router_, base::NullCallback());
   TextLogReceiver text_log_receiver_;
-  base::ScopedObservation<LogRouter, LogReceiver> scoped_logging_subscription_{
-      &text_log_receiver_};
+  ScopedLogRouterObservation scoped_logging_subscription_{&log_router_,
+                                                          &text_log_receiver_};
 };
 
+// A simple `AutofillClient` for tests. Consider `TestContentAutofillClient` as
+// an alternative for tests where the content layer is visible.
+using TestAutofillClient = TestAutofillClientTemplate<AutofillClient>;
+
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_CLIENT_H_
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.cc b/components/autofill/core/browser/test_browser_autofill_manager.cc
index 1077e422..1cc14cea 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.cc
+++ b/components/autofill/core/browser/test_browser_autofill_manager.cc
@@ -32,11 +32,9 @@
 }  // namespace
 
 TestBrowserAutofillManager::TestBrowserAutofillManager(
-    TestAutofillDriver* driver,
+    AutofillDriver* driver,
     TestAutofillClient* client)
-    : BrowserAutofillManager(driver, client, "en-US"),
-      client_(client),
-      driver_(driver) {}
+    : BrowserAutofillManager(driver, client, "en-US"), client_(client) {}
 
 TestBrowserAutofillManager::~TestBrowserAutofillManager() = default;
 
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.h b/components/autofill/core/browser/test_browser_autofill_manager.h
index 07289296..2bb8d91c 100644
--- a/components/autofill/core/browser/test_browser_autofill_manager.h
+++ b/components/autofill/core/browser/test_browser_autofill_manager.h
@@ -14,19 +14,19 @@
 #include "base/run_loop.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
+#include "components/autofill/core/browser/test_autofill_client.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/image/image_unittest_util.h"
 
 namespace autofill {
 
-class TestAutofillClient;
-class TestAutofillDriver;
+class AutofillDriver;
 class FormStructure;
 class TestPersonalDataManager;
 
 class TestBrowserAutofillManager : public BrowserAutofillManager {
  public:
-  TestBrowserAutofillManager(TestAutofillDriver* driver,
+  TestBrowserAutofillManager(AutofillDriver* driver,
                              TestAutofillClient* client);
 
   TestBrowserAutofillManager(const TestBrowserAutofillManager&) = delete;
@@ -36,7 +36,6 @@
   ~TestBrowserAutofillManager() override;
 
   TestAutofillClient* client() { return client_; }
-  TestAutofillDriver* driver() { return driver_; }
 
   // AutofillManager overrides.
   // The overrides ensure that the thread is blocked until the form has been
@@ -140,7 +139,6 @@
 
  private:
   raw_ptr<TestAutofillClient> client_;
-  raw_ptr<TestAutofillDriver> driver_;
 
   bool autofill_profile_enabled_ = true;
   bool autofill_credit_card_enabled_ = true;
diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
index 0ee3cce..05dce19 100644
--- a/components/autofill/core/common/autofill_prefs.cc
+++ b/components/autofill/core/common/autofill_prefs.cc
@@ -46,6 +46,12 @@
 // Boolean that is true if Autofill is enabled and allowed to save data.
 const char kAutofillEnabledDeprecated[] = "autofill.enabled";
 
+// Boolean that is true if a form with an IBAN field has ever been submitted, or
+// an IBAN has ever been saved via Chrome payments settings page. This helps to
+// enable IBAN functionality for those users who are not in a country where IBAN
+// is generally available but have used IBAN already.
+const char kAutofillHasSeenIban[] = "autofill.has_seen_iban";
+
 // Boolean that is true if Autofill is enabled and allowed to save IBAN data.
 extern const char kAutofillIBANEnabled[] = "autofill.iban_enabled";
 
@@ -108,7 +114,9 @@
   registry->RegisterIntegerPref(
       prefs::kAutofillLastVersionDeduped, 0,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
-
+  registry->RegisterBooleanPref(
+      prefs::kAutofillHasSeenIban, false,
+      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterIntegerPref(
       prefs::kAutofillLastVersionDisusedAddressesDeleted, 0,
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
@@ -169,6 +177,16 @@
   prefs->SetBoolean(kAutofillCreditCardEnabled, enabled);
 }
 
+bool HasSeenIban(const PrefService* prefs) {
+  return prefs->GetBoolean(kAutofillHasSeenIban);
+}
+
+// If called, always sets the pref to true, and once true, it will follow the
+// user around forever.
+void SetAutofillHasSeenIban(PrefService* prefs) {
+  prefs->SetBoolean(kAutofillHasSeenIban, true);
+}
+
 bool IsAutofillIBANEnabled(const PrefService* prefs) {
   return prefs->GetBoolean(kAutofillIBANEnabled);
 }
diff --git a/components/autofill/core/common/autofill_prefs.h b/components/autofill/core/common/autofill_prefs.h
index ecaddf2..ae1ec83 100644
--- a/components/autofill/core/common/autofill_prefs.h
+++ b/components/autofill/core/common/autofill_prefs.h
@@ -30,6 +30,7 @@
 // Please use kAutofillCreditCardEnabled, kAutofillIBANEnabled and
 // kAutofillProfileEnabled instead.
 extern const char kAutofillEnabledDeprecated[];
+extern const char kAutofillHasSeenIban[];
 extern const char kAutofillIBANEnabled[];
 extern const char kAutofillLastVersionDeduped[];
 extern const char kAutofillLastVersionDisusedAddressesDeleted[];
@@ -67,6 +68,10 @@
 
 void SetAutofillCreditCardEnabled(PrefService* prefs, bool enabled);
 
+bool HasSeenIban(const PrefService* prefs);
+
+void SetAutofillHasSeenIban(PrefService* prefs);
+
 bool IsAutofillIBANEnabled(const PrefService* prefs);
 
 void SetAutofillIBANEnabled(PrefService* prefs, bool enabled);
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index ec11a5a..87460a8 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -142,6 +142,9 @@
   <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V4" desc="Title text for the Autofill save card prompt when the card is to be saved by uploading it to Google Payments, according to November 2018 UI guidelines. The prompt can be either a bubble or an infobar.">
     Save card to Google Account?
   </message>
+  <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V5" desc="Title text for the Autofill save card prompt when the card is to be saved by uploading it to Google Payments, based on the results for the Save Card UI experiment. The prompt can be either a bubble or an infobar.">
+    Save card?
+  </message>
   <message name="IDS_AUTOFILL_CARD_SAVED" desc="Title text for the Autofill save card manager bubble when the card has been saved either locally or to Google Payments. Also label for icon animation.">
     Card saved
   </message>
@@ -172,6 +175,9 @@
   <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V3_WITH_NAME" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments, according to April 2018 UI guidelines. The prompt will be shown in a bubble below the omnibox.">
     To pay faster next time, save your card, name, and billing address to your Google Account.
   </message>
+  <message name="IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V4" desc="Explanation of the effect of the Autofill save card prompt when the card is to be saved by uploading it to Google Payments, based on the results for the Save Card UI experiment. The prompt will be shown in a bubble below the omnibox.">
+    Pay faster next time and protect your card with Google’s industry-leading security.
+  </message>
 
   <if expr="is_ios">
     <then>
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V5.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V5.png.sha1
new file mode 100644
index 0000000..9d559d2
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_TITLE_TO_CLOUD_V5.png.sha1
@@ -0,0 +1 @@
+7cc485b5d014636437eaa417f6f94b913e1465de
\ No newline at end of file
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V4.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V4.png.sha1
new file mode 100644
index 0000000..9d559d2
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_V4.png.sha1
@@ -0,0 +1 @@
+7cc485b5d014636437eaa417f6f94b913e1465de
\ No newline at end of file
diff --git a/components/background_task_scheduler/task_ids.h b/components/background_task_scheduler/task_ids.h
index 277633c..a1914df 100644
--- a/components/background_task_scheduler/task_ids.h
+++ b/components/background_task_scheduler/task_ids.h
@@ -22,32 +22,113 @@
 // GENERATED_JAVA_ENUM_PACKAGE: (
 // org.chromium.components.background_task_scheduler)
 enum class TaskIds {
+  // component: Internals>BackgroundTaskScheduler
+  // team_email: clank-dev@google.com
+  // owner: nyquist@chromium.org, shaktisahu@chromium.org
   TEST = 0x00008378,
+  // component: Internals>Installer
+  // team_email: chrome-updates-dev@chromium.org
+  // owner: waffles@chromium.org
   OMAHA_JOB_ID = 0x00011684,
+  // component: Services>CloudMessaging
+  // team_email:
+  // owner: peter@chromium.org
   GCM_BACKGROUND_TASK_JOB_ID = 1,
+  // component: UI>Notifications
+  // team_email: platform-capabilities@chromium.org
+  // owner: peter@chromium.org
   NOTIFICATION_SERVICE_JOB_ID = 21,
+  // component: Mobile>WebView
+  // team_email: android-webview-dev@chromium.org
+  // owner: boliu@chromium.org
   WEBVIEW_MINIDUMP_UPLOADING_JOB_ID = 42,
+  // component: Internals>CrashReporting
+  // team_email:
+  // owner: wnwen@chromium.org
   CHROME_MINIDUMP_UPLOADING_JOB_ID = 43,
+  // component: UI>Browser>Offline
+  // team_email: offline-dev@chromium.org
+  // owner: dewittj@chromium.org
   OFFLINE_PAGES_BACKGROUND_JOB_ID = 77,
+  // component: UI>Browser>Offline
+  // team_email: offline-dev@chromium.org
+  // owner: dewittj@chromium.org
   OFFLINE_PAGES_PREFETCH_JOB_ID = 78,
+  // component: UI>Browser>Offline
+  // team_email: offline-dev@chromium.org
+  // owner: dewittj@chromium.org
   OFFLINE_PAGES_PREFETCH_NOTIFICATION_JOB_ID = 79,
+  // component: UI>Browser>Downloads
+  // team_email:
+  // owner: qinmin@chromium.org
   DOWNLOAD_SERVICE_JOB_ID = 53,
+  // component: UI>Browser>Downloads
+  // team_email:
+  // owner: qinmin@chromium.org
   DOWNLOAD_CLEANUP_JOB_ID = 54,
+  // component: Mobile>WebView
+  // team_email: android-webview-dev@chromium.org
+  // owner: ntfschr@chromium.org, torne@chromium.org
   WEBVIEW_VARIATIONS_SEED_FETCH_JOB_ID = 83,
+  // component: UI>Browser>WebAppInstalls
+  // team_email:
+  // owner: hartmanng@chromium.org
   WEBAPK_UPDATE_JOB_ID = 91,
+  // component: UI>Browser>Downloads
+  // team_email:
+  // owner: qinmin@chromium.org
   DEPRECATED_DOWNLOAD_RESUMPTION_JOB_ID = 55,
+  // component: UI>Browser>Downloads
+  // team_email:
+  // owner: qinmin@chromium.org
   DOWNLOAD_AUTO_RESUMPTION_JOB_ID = 56,
+  // component: UI>Browser>Downloads
+  // team_email:
+  // owner: qinmin@chromium.org
   DOWNLOAD_LATER_JOB_ID = 57,
+  // component: UI>Browser>ContentSuggestions>Feed
+  // team_email: feed@chromium.org
+  // owner: dewittj@chromium.org
   FEED_REFRESH_JOB_ID = 22,
+  // component: Internals>Installer>Components
+  // team_email: chrome-updates-dev@chromium.org
+  // owner: waffles@chromium.org
   COMPONENT_UPDATE_JOB_ID = 2,
+  // component: Blink>BackgroundSync
+  // team_email: platform-capabilities@chromium.org
+  // owner: peter@chromium.org
   BACKGROUND_SYNC_ONE_SHOT_JOB_ID = 102,
+  // component: UI>Notifications
+  // team_email: platform-capabilities@chromium.org
+  // owner: dtrainor@chromium.org
   NOTIFICATION_SCHEDULER_JOB_ID = 103,
+  // component: UI>Notifications
+  // team_email: platform-capabilities@chromium.org
+  // owner: peter@chromium.org, dtrainor@chromium.org
   NOTIFICATION_TRIGGER_JOB_ID = 104,
+  // component: Blink>BackgroundSync
+  // team_email: platform-capabilities@chromium.org
+  // owner: peter@chromium.org
   PERIODIC_BACKGROUND_SYNC_CHROME_WAKEUP_TASK_JOB_ID = 105,
+  // component: Upboarding>QueryTiles
+  // team_email: chrome-upboarding-eng@google.com
+  // owner: qinmin@chromium.org, shaktisahu@chromium.org
   QUERY_TILE_JOB_ID = 106,
+  // component: UI>Browser>ContentSuggestions>Feed
+  // team_email: feed@chromium.org
+  // owner: dewittj@chromium.org
   FEEDV2_REFRESH_JOB_ID = 107,
+  // component: UI>Browser>ContentSuggestions>Feed
+  // team_email: feed@chromium.org
+  // owner: dewittj@chromium.org
   WEBFEEDS_REFRESH_JOB_ID = 109,
+  // component: Mobile>WebView
+  // team_email: android-webview-dev@chromium.org
+  // owner: ntfschr@chromium.org, torne@chromium.org
   WEBVIEW_COMPONENT_UPDATE_JOB_ID = 110,
+  // component: Internals>AttributionReporting
+  // team_email: privacy-sandbox-dev@chromium.org
+  // owner: csharrison@chromium.org
   ATTRIBUTION_PROVIDER_FLUSH_JOB_ID = 111,
 };
 
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
index 95e759f..48bcdc7d 100644
--- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
+++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
@@ -193,12 +193,6 @@
         }
     }
 
-    /**
-     * The instance passed to the current content that is allowed to
-     * change the sheet offset.
-     */
-    private Callback<Integer> mOffsetController;
-
     @Override
     public boolean shouldGestureMoveSheet(MotionEvent initialEvent, MotionEvent currentEvent) {
         // If the sheet is scrolling off-screen or in the process of hiding, gestures should not
@@ -539,12 +533,7 @@
 
         // Remove this as listener from previous content layout and size changes.
         if (mSheetContent != null) {
-            mSheetContent.setContentSizeListener(null);
             mSheetContent.getContentView().removeOnLayoutChangeListener(this);
-            if (mOffsetController != null) {
-                mSheetContent.setOffsetController(null);
-                mOffsetController = null;
-            }
         }
 
         if (content != null && getParent() == null) {
@@ -1273,34 +1262,16 @@
     protected void onSheetContentChanged(@Nullable final BottomSheetContent content) {
         mSheetContent = content;
 
-        if (content != null) {
-            if (isFullHeightWrapContent()) {
-                // Listen for layout/size changes.
-                if (!content.setContentSizeListener(this::onContentSizeChanged)) {
-                    content.getContentView().addOnLayoutChangeListener(this);
-                }
+        if (content != null && isFullHeightWrapContent()) {
+            // Listen for layout/size changes.
+            content.getContentView().addOnLayoutChangeListener(this);
 
-                invalidateContentDesiredHeight();
-                ensureContentIsWrapped(/* animate= */ true);
+            invalidateContentDesiredHeight();
+            ensureContentIsWrapped(/* animate= */ true);
 
-                // HALF state is forbidden when wrapping the content.
-                if (mCurrentState == SheetState.HALF) {
-                    setSheetState(SheetState.FULL, /* animate= */ true);
-                }
-            }
-            if (content.contentControlsOffset()) {
-                mOffsetController = new Callback<Integer>() {
-                    @Override
-                    public void onResult(Integer offsetPx) {
-                        if (this != mOffsetController) return;
-
-                        cancelAnimation();
-                        setSheetOffsetFromBottom(
-                                MathUtils.clamp(offsetPx, 0, (int) getMaxOffsetPx()),
-                                StateChangeReason.NONE, /* reportOpenClosed=*/false);
-                    }
-                };
-                content.setOffsetController(mOffsetController);
+            // HALF state is forbidden when wrapping the content.
+            if (mCurrentState == SheetState.HALF) {
+                setSheetState(SheetState.FULL, /* animate= */ true);
             }
         }
 
@@ -1323,28 +1294,6 @@
         ensureContentIsWrapped(/* animate= */ true);
     }
 
-    /**
-     * Called when the sheet content size changed.
-     */
-    private void onContentSizeChanged(int width, int height, int oldWidth, int oldHeight) {
-        boolean heightChanged = mContentDesiredHeight != height;
-        boolean widthChanged = mContentWidth != width;
-
-        // onContentSizeChanged() is sometimes called when there's no size change, because of
-        // animations running in the content. Ignore these calls.
-        if (!heightChanged && !widthChanged) return;
-
-        mContentDesiredHeight = height;
-        mContentWidth = width;
-
-        if (heightChanged && mCurrentState == SheetState.SCROLLING) {
-            endAnimations();
-            return;
-        }
-
-        ensureContentIsWrapped(/* animate= */ false);
-    }
-
     private void ensureContentIsWrapped(boolean animate) {
         if (mCurrentState == SheetState.HIDDEN || mCurrentState == SheetState.PEEK) return;
 
diff --git a/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetContent.java b/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetContent.java
index e2d54bee..0041aa1 100644
--- a/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetContent.java
+++ b/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetContent.java
@@ -9,7 +9,6 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
 
-import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 
 import java.lang.annotation.Retention;
@@ -155,18 +154,6 @@
     }
 
     /**
-     * Set a {@link ContentSizeListener} that should be notified when the size of the content
-     * has changed. This will be called only if {@link #getFullHeightRatio()} returns {@link
-     * HeightMode#WRAP_CONTENT}. Note that you need to implement this method only if the content
-     * view height changes are animated.
-     *
-     * @return Whether the listener was correctly set.
-     */
-    default boolean setContentSizeListener(@Nullable ContentSizeListener listener) {
-        return false;
-    }
-
-    /**
      * @return Whether the sheet should be hidden when it is in the PEEK state and the user
      *         scrolls down the page.
      */
@@ -225,23 +212,4 @@
      *         typically the name of your feature followed by 'closed'.
      */
     int getSheetClosedAccessibilityStringId();
-
-    /**
-     * Return {@code true} if the content expects {@link #setOffsetController} to be called.
-     *
-     * This is an experimental feature. Use it at your own risks. TODO(b/177037825): Remove or
-     * cleanup.
-     */
-    default boolean contentControlsOffset() {
-        return false;
-    }
-
-    /**
-     * Set or reset the set offset callback.
-     *
-     * The active content can use this callback to move the sheet to the given offset.
-     *
-     * Only called if {@link #contentControlsOffset} returns {@code true}.
-     */
-    default void setOffsetController(@Nullable Callback<Integer> setOffset) {}
 }
diff --git a/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java b/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java
index 98b4b27..9972baf3 100644
--- a/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java
+++ b/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java
@@ -12,7 +12,6 @@
 
 import androidx.annotation.Nullable;
 
-import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -55,13 +54,6 @@
     /** Whether this content intercepts back button presses. */
     private boolean mHandleBackPress;
 
-    /** Set to true to ask for an offset controller. */
-    private boolean mContentControlsOffset;
-
-    /** Current offset controller. */
-    @Nullable
-    private Callback<Integer> mOffsetController;
-
     private ObservableSupplierImpl<Boolean> mBackPressStateChangedSupplier;
 
     /**
@@ -195,11 +187,6 @@
     }
 
     @Override
-    public boolean setContentSizeListener(@Nullable ContentSizeListener listener) {
-        return false;
-    }
-
-    @Override
     public boolean handleBackPress() {
         return mHandleBackPress;
     }
@@ -242,22 +229,4 @@
     public int getSheetClosedAccessibilityStringId() {
         return android.R.string.copy;
     }
-
-    @Override
-    public boolean contentControlsOffset() {
-        return mContentControlsOffset;
-    }
-
-    @Override
-    public void setOffsetController(Callback<Integer> offsetController) {
-        mOffsetController = offsetController;
-    }
-
-    public Callback<Integer> getOffsetController() {
-        return mOffsetController;
-    }
-
-    public void setContentControlsOffset(boolean value) {
-        mContentControlsOffset = value;
-    }
 }
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer.cc b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
index f866338..e898f711 100644
--- a/components/certificate_transparency/chrome_ct_policy_enforcer.cc
+++ b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
@@ -88,19 +88,18 @@
   return "unknown";
 }
 
-base::Value NetLogCertComplianceCheckResultParams(
+base::Value::Dict NetLogCertComplianceCheckResultParams(
     net::X509Certificate* cert,
     bool build_timely,
     CTPolicyCompliance compliance) {
-  base::Value dict(base::Value::Type::DICT);
+  base::Value::Dict dict;
   // TODO(mattm): This double-wrapping of the certificate list is weird. Remove
   // this (probably requires updates to netlog-viewer).
-  base::Value certificate_dict(base::Value::Type::DICT);
-  certificate_dict.SetKey("certificates", net::NetLogX509CertificateList(cert));
-  dict.SetKey("certificate", std::move(certificate_dict));
-  dict.SetBoolKey("build_timely", build_timely);
-  dict.SetStringKey("ct_compliance_status",
-                    CTPolicyComplianceToString(compliance));
+  base::Value::Dict certificate_dict;
+  certificate_dict.Set("certificates", net::NetLogX509CertificateList(cert));
+  dict.Set("certificate", std::move(certificate_dict));
+  dict.Set("build_timely", build_timely);
+  dict.Set("ct_compliance_status", CTPolicyComplianceToString(compliance));
   return dict;
 }
 
diff --git a/components/crash/core/app/BUILD.gn b/components/crash/core/app/BUILD.gn
index 172dc14c..03eadc9 100644
--- a/components/crash/core/app/BUILD.gn
+++ b/components/crash/core/app/BUILD.gn
@@ -160,6 +160,7 @@
       "//base",
       "//build:chromeos_buildflags",
       "//components/gwp_asan/buildflags",
+      "//components/stability_report",
       "//third_party/crashpad/crashpad/client",
       "//third_party/crashpad/crashpad/handler",
       "//third_party/crashpad/crashpad/minidump",
diff --git a/components/crash/core/app/DEPS b/components/crash/core/app/DEPS
index a68e5f5..5af8561 100644
--- a/components/crash/core/app/DEPS
+++ b/components/crash/core/app/DEPS
@@ -2,6 +2,7 @@
   "+sandbox",
   "+third_party/breakpad",
 
+  "+components/stability_report/user_stream_data_source.h",
   "+components/crash/android/jni_headers",
   "+components/gwp_asan/buildflags/buildflags.h",
   "+components/gwp_asan/crash_handler/crash_handler.h",
diff --git a/components/crash/core/app/run_as_crashpad_handler_win.cc b/components/crash/core/app/run_as_crashpad_handler_win.cc
index ac2a160..a9f69e045 100644
--- a/components/crash/core/app/run_as_crashpad_handler_win.cc
+++ b/components/crash/core/app/run_as_crashpad_handler_win.cc
@@ -17,6 +17,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/platform_thread.h"
 #include "components/gwp_asan/buildflags/buildflags.h"
+#include "components/stability_report/user_stream_data_source.h"
 #include "third_party/crashpad/crashpad/client/crashpad_info.h"
 #include "third_party/crashpad/crashpad/client/simple_string_dictionary.h"
 #include "third_party/crashpad/crashpad/handler/handler_main.h"
@@ -80,6 +81,8 @@
   argv.clear();
 
   crashpad::UserStreamDataSources user_stream_data_sources;
+  user_stream_data_sources.push_back(
+      std::make_unique<stability_report::UserStreamDataSource>());
 
 #if BUILDFLAG(ENABLE_GWP_ASAN)
   user_stream_data_sources.push_back(
diff --git a/components/cronet/stale_host_resolver.cc b/components/cronet/stale_host_resolver.cc
index 2495e7f..7e2070e 100644
--- a/components/cronet/stale_host_resolver.cc
+++ b/components/cronet/stale_host_resolver.cc
@@ -368,7 +368,7 @@
   return inner_resolver_->GetHostCache();
 }
 
-base::Value StaleHostResolver::GetDnsConfigAsValue() const {
+base::Value::Dict StaleHostResolver::GetDnsConfigAsValue() const {
   return inner_resolver_->GetDnsConfigAsValue();
 }
 
diff --git a/components/cronet/stale_host_resolver.h b/components/cronet/stale_host_resolver.h
index 3240f8ec..4fcbaee 100644
--- a/components/cronet/stale_host_resolver.h
+++ b/components/cronet/stale_host_resolver.h
@@ -11,6 +11,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/default_tick_clock.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/network_anonymization_key.h"
 #include "net/dns/host_resolver.h"
@@ -101,7 +102,7 @@
   // The remaining public methods pass through to the inner resolver:
 
   net::HostCache* GetHostCache() override;
-  base::Value GetDnsConfigAsValue() const override;
+  base::Value::Dict GetDnsConfigAsValue() const override;
   void SetRequestContext(net::URLRequestContext* request_context) override;
 
  private:
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
index 3d9cb0d..5e91ef33 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java
@@ -17,6 +17,9 @@
  */
 @JNINamespace("dom_distiller::url_utils::android")
 public final class DomDistillerUrlUtils {
+    // Keep in sync with components/dom_distiller/core/url_constants.cc
+    private static final String DOM_DISTILLER_SCHEME = "chrome-distiller";
+
     private DomDistillerUrlUtils() {
     }
 
@@ -54,6 +57,7 @@
 
     public static boolean isDistilledPage(String url) {
         if (TextUtils.isEmpty(url)) return false;
+        if (!url.startsWith(DOM_DISTILLER_SCHEME + ":")) return false;
         return DomDistillerUrlUtilsJni.get().isDistilledPage(url);
     }
 
@@ -64,6 +68,7 @@
      * @return whether the url is for a distilled page.
      */
     public static boolean isDistilledPage(GURL url) {
+        if (!url.getScheme().equals(DOM_DISTILLER_SCHEME)) return false;
         return isDistilledPage(url.getSpec());
     }
 
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc
index d63abb0..6be10f25 100644
--- a/components/dom_distiller/standalone/content_extractor_browsertest.cc
+++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -399,9 +399,7 @@
 
     if (command_line.HasSwitch(kOutputFile)) {
       base::FilePath filename = command_line.GetSwitchValuePath(kOutputFile);
-      ASSERT_EQ(
-          (int)output_data_.size(),
-          base::WriteFile(filename, output_data_.c_str(), output_data_.size()));
+      ASSERT_TRUE(base::WriteFile(filename, output_data_));
     } else {
       VLOG(0) << output_data_;
     }
diff --git a/components/domain_reliability/uploader_unittest.cc b/components/domain_reliability/uploader_unittest.cc
index cc44c82..96499e2 100644
--- a/components/domain_reliability/uploader_unittest.cc
+++ b/components/domain_reliability/uploader_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_simple_task_runner.h"
 #include "components/domain_reliability/test_util.h"
@@ -188,6 +189,10 @@
         uploader_(
             DomainReliabilityUploader::Create(&time_,
                                               url_request_context_.get())) {
+    scoped_feature_list_.InitAndEnableFeature(
+        net::features::kEnableCrossSiteFlagNetworkAnonymizationKey);
+    expected_isolation_info_ = net::IsolationInfo::CreateTransient();
+
     auto interceptor =
         std::make_unique<UploadInterceptor>(expected_isolation_info_);
     interceptor_ = interceptor.get();
@@ -211,11 +216,11 @@
   }
 
  private:
+  base::test::ScopedFeatureList scoped_feature_list_;
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
 
-  const net::IsolationInfo expected_isolation_info_ =
-      net::IsolationInfo::CreateTransient();
+  net::IsolationInfo expected_isolation_info_;
 
   std::unique_ptr<net::URLRequestContext> url_request_context_;
   raw_ptr<UploadInterceptor> interceptor_;
diff --git a/components/exo/surface_tree_host.h b/components/exo/surface_tree_host.h
index 83c5a457..17fc10ae 100644
--- a/components/exo/surface_tree_host.h
+++ b/components/exo/surface_tree_host.h
@@ -81,6 +81,11 @@
 
   using PresentationCallbacks = std::list<Surface::PresentationCallback>;
 
+  base::queue<std::list<Surface::FrameCallback>>&
+  GetFrameCallbacksForTesting() {
+    return frame_callbacks_;
+  }
+
   base::flat_map<uint32_t, PresentationCallbacks>&
   GetActivePresentationCallbacksForTesting() {
     return active_presentation_callbacks_;
diff --git a/components/exo/surface_unittest.cc b/components/exo/surface_unittest.cc
index 846bc1c..3ce6d92 100644
--- a/components/exo/surface_unittest.cc
+++ b/components/exo/surface_unittest.cc
@@ -4,9 +4,13 @@
 
 #include "components/exo/surface.h"
 
+#include <tuple>
+
 #include "base/command_line.h"
 #include "base/functional/bind.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "components/exo/buffer.h"
 #include "components/exo/shell_surface.h"
@@ -14,13 +18,12 @@
 #include "components/exo/surface_test_util.h"
 #include "components/exo/test/exo_test_base.h"
 #include "components/exo/test/exo_test_helper.h"
+#include "components/exo/test/surface_tree_host_test_util.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "components/viz/common/quads/texture_draw_quad.h"
 #include "components/viz/service/surfaces/surface.h"
 #include "components/viz/service/surfaces/surface_manager.h"
-#include "components/viz/test/begin_frame_args_test.h"
-#include "components/viz/test/fake_external_begin_frame_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "ui/compositor/layer.h"
@@ -86,10 +89,17 @@
   return prefix + name;
 }
 
-class SurfaceTest : public test::ExoTestBase,
-                    public ::testing::WithParamInterface<float> {
+class SurfaceTest
+    : public test::ExoTestBase,
+      public ::testing::WithParamInterface<std::tuple<bool, float>> {
  public:
-  SurfaceTest() = default;
+  SurfaceTest() {
+    if (reactive_frame_submission_enabled()) {
+      feature_list_.InitAndEnableFeature(kExoReactiveFrameSubmission);
+    } else {
+      feature_list_.InitAndDisableFeature(kExoReactiveFrameSubmission);
+    }
+  }
 
   SurfaceTest(const SurfaceTest&) = delete;
   SurfaceTest& operator=(const SurfaceTest&) = delete;
@@ -109,7 +119,10 @@
     display::Display::ResetForceDeviceScaleFactorForTesting();
   }
 
-  float device_scale_factor() const { return GetParam(); }
+  bool reactive_frame_submission_enabled() const {
+    return std::get<0>(GetParam());
+  }
+  float device_scale_factor() const { return std::get<1>(GetParam()); }
 
   gfx::Rect ToPixel(const gfx::Rect rect) {
     return gfx::ToEnclosingRect(
@@ -155,19 +168,35 @@
       Transform transform,
       const gfx::RectF& expected_rect,
       bool has_viewport);
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
 };
 
 void ReleaseBuffer(int* release_buffer_call_count) {
   (*release_buffer_call_count)++;
 }
 
+base::RepeatingClosure CreateReleaseBufferClosure(
+    int* release_buffer_call_count,
+    base::RepeatingClosure closure) {
+  return base::BindLambdaForTesting(
+      [release_buffer_call_count, closure = std::move(closure)]() {
+        (*release_buffer_call_count)++;
+        closure.Run();
+      });
+}
+
 void ExplicitReleaseBuffer(int* release_buffer_call_count,
                            gfx::GpuFenceHandle release_fence) {
   (*release_buffer_call_count)++;
 }
 
 // Instantiate the values of device scale factor in the parameterized tests.
-INSTANTIATE_TEST_SUITE_P(All, SurfaceTest, testing::Values(1.0f, 1.25f, 2.0f));
+INSTANTIATE_TEST_SUITE_P(All,
+                         SurfaceTest,
+                         testing::Combine(testing::Values(false, true),
+                                          testing::Values(1.0f, 1.25f, 2.0f)));
 
 TEST_P(SurfaceTest, Damage) {
   gfx::Size buffer_size(256, 256);
@@ -191,7 +220,7 @@
   // Check that damage larger than contents is handled correctly at commit.
   surface->Damage(gfx::Rect(gfx::ScaleToCeiledSize(buffer_size, 2.0f)));
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     const viz::CompositorFrame& frame =
@@ -205,7 +234,7 @@
   // Check that damage is correct for a non-square rectangle not at the origin.
   surface->Damage(surface_damage);
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   // Adjust damage for DSF filtering and verify it below.
   if (device_scale_factor() > 1.f)
@@ -236,7 +265,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Initial frame has full damage.
@@ -254,7 +283,7 @@
   child_surface->Damage(gfx::ToNearestRect(subsurface_damage));
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Subsurface damage should be propagated.
@@ -268,7 +297,7 @@
 
   surface->Damage(gfx::ToNearestRect(surface_damage));
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // When commit is called on the root with no call on the child, the damage
@@ -300,7 +329,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Initial frame has full damage.
@@ -322,7 +351,7 @@
   child_surface->Commit();
   EXPECT_FALSE(child_surface->HasPendingDamageForTesting(
       gfx::ToNearestRect(subsurface_damage)));
-  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(shell_surface->GetFrameCallbacksForTesting().empty());
 
   {
     // Subsurface damage should not be propagated at all.
@@ -339,7 +368,7 @@
       gfx::ToNearestRect(subsurface_damage2)));
   // Apply subsurface damage from cached state, not pending state.
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Subsurface damage in cached state should be propagated.
@@ -370,7 +399,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Initial frame has full damage.
@@ -391,7 +420,7 @@
   child_surface->Commit();
   EXPECT_FALSE(child_surface->HasPendingDamageForTesting(
       gfx::ToNearestRect(subsurface_damage)));
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Subsurface damage should be propagated.
@@ -443,7 +472,7 @@
   // draw with blending.
   surface->SetOpaqueRegion(gfx::Rect(256, 256));
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     const viz::CompositorFrame& frame =
@@ -461,7 +490,7 @@
   // Setting an empty opaque region requires draw with blending.
   surface->SetOpaqueRegion(gfx::Rect());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     const viz::CompositorFrame& frame =
@@ -483,7 +512,7 @@
   // blending.
   surface->Attach(buffer_without_alpha.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     const viz::CompositorFrame& frame =
@@ -608,7 +637,7 @@
   buffer_size_float.Scale(1.0f / kBufferScale);
   EXPECT_EQ(buffer_size_float.ToString(), surface->content_size().ToString());
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get());
   ASSERT_EQ(1u, frame.render_pass_list.size());
@@ -632,7 +661,7 @@
   EXPECT_EQ(gfx::SizeF(expected_size.width(), expected_size.height()),
             surface->content_size());
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface);
 
   {
     const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface);
@@ -700,7 +729,7 @@
       gfx::ScaleToRoundedSize(child_buffer_size, 1.0f / kChildBufferScale),
       gfx::ToRoundedSize(child_surface->content_size()));
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     const viz::CompositorFrame& frame =
@@ -728,7 +757,7 @@
   surface->Attach(buffer.get());
   surface->Commit();
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   EXPECT_EQ(buffer_size, surface->window()->bounds().size());
   EXPECT_EQ(buffer_size, surface->window()->layer()->bounds().size());
@@ -765,7 +794,7 @@
             gfx::SizeF(surface->window()->bounds().size()).ToString());
   EXPECT_EQ(viewport2.ToString(), surface->content_size().ToString());
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get());
   ASSERT_EQ(1u, frame.render_pass_list.size());
@@ -826,7 +855,7 @@
       }
       child_surface->Commit();
       surface->Commit();
-      base::RunLoop().RunUntilIdle();
+      test::WaitForLastFrameAck(shell_surface.get());
 
       const viz::CompositorFrame& frame =
           GetFrameFromSurface(shell_surface.get());
@@ -878,7 +907,7 @@
   EXPECT_EQ(gfx::SizeF(crop_size).ToString(),
             surface->content_size().ToString());
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get());
   ASSERT_EQ(1u, frame.render_pass_list.size());
@@ -909,7 +938,7 @@
   surface->SetBufferTransform(transform);
   surface->Commit();
 
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface);
 
   {
     const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface);
@@ -1011,7 +1040,7 @@
   surface->Attach(buffer.get());
   surface->SetBlendMode(SkBlendMode::kSrc);
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get());
   ASSERT_EQ(1u, frame.render_pass_list.size());
@@ -1031,7 +1060,7 @@
 
   surface->Attach(buffer.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   const viz::CompositorFrame& frame = GetFrameFromSurface(shell_surface.get());
   ASSERT_EQ(1u, frame.render_pass_list.size());
@@ -1056,7 +1085,7 @@
     surface->Attach(buffer.get());
     surface->SetAlpha(0.5f);
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1070,7 +1099,7 @@
   {
     surface->SetAlpha(0.f);
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1084,7 +1113,7 @@
   {
     surface->SetAlpha(1.f);
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1116,7 +1145,7 @@
 
   {
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1150,7 +1179,7 @@
 
   {
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1188,7 +1217,7 @@
 
   {
     surface->Commit();
-    base::RunLoop().RunUntilIdle();
+    test::WaitForLastFrameAck(shell_surface.get());
 
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1255,7 +1284,7 @@
 
     {
       surface->Commit();
-      base::RunLoop().RunUntilIdle();
+      test::WaitForLastFrameAck(shell_surface.get());
 
       const viz::CompositorFrame& frame =
           GetFrameFromSurface(shell_surface.get());
@@ -1298,7 +1327,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   // Remove the subsurface by destroying it. This should not damage |surface|.
   // TODO(penghuang): Make the damage more precise for sub surface changes.
@@ -1316,7 +1345,7 @@
 
   surface->Attach(buffer.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   // Make sure surface size is still valid after buffer is destroyed.
   buffer.reset();
@@ -1340,12 +1369,14 @@
   auto shell_surface = std::make_unique<ShellSurface>(surface.get());
 
   int release_buffer_call_count = 0;
-  buffer->set_release_callback(base::BindRepeating(
-      &ReleaseBuffer, base::Unretained(&release_buffer_call_count)));
+  base::RunLoop run_loop;
+  buffer->set_release_callback(CreateReleaseBufferClosure(
+      &release_buffer_call_count, run_loop.QuitClosure()));
 
   surface->Attach(buffer.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
+
   // Buffer is still attached at this point.
   EXPECT_EQ(0, release_buffer_call_count);
 
@@ -1353,7 +1384,7 @@
   // attached buffer.
   shell_surface.reset();
   surface.reset();
-  base::RunLoop().RunUntilIdle();
+  run_loop.Run();
   ASSERT_EQ(1, release_buffer_call_count);
 }
 
@@ -1417,7 +1448,6 @@
       base::BindOnce([](gfx::GpuFenceHandle) {}));
   EXPECT_TRUE(surface->HasPendingPerCommitBufferReleaseCallback());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(surface->HasPendingPerCommitBufferReleaseCallback());
 }
 
@@ -1441,7 +1471,7 @@
       &ExplicitReleaseBuffer, base::Unretained(&per_commit_release_count)));
   surface->Attach(buffer1.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   EXPECT_EQ(per_commit_release_count, 0);
   EXPECT_EQ(buffer_release_count, 0);
 
@@ -1450,14 +1480,14 @@
       &ExplicitReleaseBuffer, base::Unretained(&per_commit_release_count)));
   surface->Attach(buffer1.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   EXPECT_EQ(per_commit_release_count, 1);
   EXPECT_EQ(buffer_release_count, 0);
 
   // Attaching a different buffer causes the per-commit callback to be emitted.
   surface->Attach(buffer2.get());
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   EXPECT_EQ(per_commit_release_count, 2);
   // The buffer should now be completely released.
   EXPECT_EQ(buffer_release_count, 1);
@@ -1492,7 +1522,7 @@
       &ExplicitReleaseBuffer, base::Unretained(&per_commit_release_count2)));
   surface2->Attach(buffer1.get());
   surface2->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface2.get());
   EXPECT_EQ(per_commit_release_count1, 0);
   EXPECT_EQ(per_commit_release_count2, 0);
   EXPECT_EQ(buffer_release_count, 0);
@@ -1500,7 +1530,7 @@
   // Attach buffer2 to surface1, only the surface1 callback should be emitted.
   surface1->Attach(buffer2.get());
   surface1->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface1.get());
   EXPECT_EQ(per_commit_release_count1, 1);
   EXPECT_EQ(per_commit_release_count2, 0);
   EXPECT_EQ(buffer_release_count, 0);
@@ -1508,7 +1538,7 @@
   // Attach buffer2 to surface2, only the surface2 callback should be emitted.
   surface2->Attach(buffer2.get());
   surface2->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface2.get());
   EXPECT_EQ(per_commit_release_count1, 1);
   EXPECT_EQ(per_commit_release_count2, 1);
   // The buffer should now be completely released.
@@ -1532,7 +1562,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Subsurface initially has no clip.
@@ -1552,7 +1582,7 @@
   child_surface->Attach(child_buffer.get());
   child_surface->Commit();
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
 
   {
     // Subsurface has a clip applied, and it is converted to px in the
@@ -1617,7 +1647,7 @@
   child_surface_b->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1637,7 +1667,7 @@
   child_surface_b->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1657,7 +1687,7 @@
   child_surface_b->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1677,7 +1707,7 @@
   child_surface_b->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1695,7 +1725,7 @@
   child_surface_b->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
@@ -1724,7 +1754,7 @@
   child_surface_c->Commit();
 
   surface->Commit();
-  base::RunLoop().RunUntilIdle();
+  test::WaitForLastFrameAck(shell_surface.get());
   {
     const viz::CompositorFrame& frame =
         GetFrameFromSurface(shell_surface.get());
diff --git a/components/exo/test/surface_tree_host_test_util.cc b/components/exo/test/surface_tree_host_test_util.cc
index 949df74..848e9e4 100644
--- a/components/exo/test/surface_tree_host_test_util.cc
+++ b/components/exo/test/surface_tree_host_test_util.cc
@@ -10,6 +10,17 @@
 
 namespace exo::test {
 
+void WaitForLastFrameAck(SurfaceTreeHost* surface_tree_host) {
+  CHECK(!surface_tree_host->GetFrameCallbacksForTesting().empty());
+
+  auto& list = surface_tree_host->GetFrameCallbacksForTesting().back();
+  base::RunLoop runloop;
+  list.push_back(base::BindRepeating(
+      [](base::RepeatingClosure callback, base::TimeTicks) { callback.Run(); },
+      runloop.QuitClosure()));
+  runloop.Run();
+}
+
 void WaitForLastFramePresentation(SurfaceTreeHost* surface_tree_host) {
   CHECK(!surface_tree_host->GetActivePresentationCallbacksForTesting().empty());
 
diff --git a/components/exo/test/surface_tree_host_test_util.h b/components/exo/test/surface_tree_host_test_util.h
index 265dc94e..90a8ca14 100644
--- a/components/exo/test/surface_tree_host_test_util.h
+++ b/components/exo/test/surface_tree_host_test_util.h
@@ -10,6 +10,10 @@
 namespace exo::test {
 
 // Waits for the last compositor frame submitted by `surface_tree_host` to be
+// acked.
+void WaitForLastFrameAck(SurfaceTreeHost* surface_tree_host);
+
+// Waits for the last compositor frame submitted by `surface_tree_host` to be
 // presented.
 void WaitForLastFramePresentation(SurfaceTreeHost* surface_tree_host);
 
diff --git a/components/history_clusters/history_clusters_internals/resources/BUILD.gn b/components/history_clusters/history_clusters_internals/resources/BUILD.gn
index 65ae4fd..7f14e88 100644
--- a/components/history_clusters/history_clusters_internals/resources/BUILD.gn
+++ b/components/history_clusters/history_clusters_internals/resources/BUILD.gn
@@ -19,7 +19,7 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 
diff --git a/components/image_fetcher/core/cache/image_data_store_disk.cc b/components/image_fetcher/core/cache/image_data_store_disk.cc
index af3f8cb..5d04953 100644
--- a/components/image_fetcher/core/cache/image_data_store_disk.cc
+++ b/components/image_fetcher/core/cache/image_data_store_disk.cc
@@ -56,8 +56,7 @@
                    bool needs_transcoding) {
   FilePath file_path = BuildFilePath(storage_path, key, needs_transcoding);
 
-  int len = base::WriteFile(file_path, data.c_str(), data.length());
-  if (len == -1 || (size_t)len != data.length()) {
+  if (!base::WriteFile(file_path, data)) {
     DVLOG(1) << "WriteFile failed.";
   }
 
diff --git a/components/metrics/single_sample_metrics_factory_impl_unittest.cc b/components/metrics/single_sample_metrics_factory_impl_unittest.cc
index 5c62be5..1f3e967 100644
--- a/components/metrics/single_sample_metrics_factory_impl_unittest.cc
+++ b/components/metrics/single_sample_metrics_factory_impl_unittest.cc
@@ -42,6 +42,7 @@
 
   ~SingleSampleMetricsFactoryImplTest() override {
     factory_->DestroyProviderForTesting();
+    factory_ = nullptr;
     if (thread_.IsRunning())
       ShutdownThread();
     base::SingleSampleMetricsFactory::DeleteFactoryForTesting();
diff --git a/components/mirroring/service/openscreen_session_host.cc b/components/mirroring/service/openscreen_session_host.cc
index 6fc879f..de2a4c0 100644
--- a/components/mirroring/service/openscreen_session_host.cc
+++ b/components/mirroring/service/openscreen_session_host.cc
@@ -513,7 +513,10 @@
       // Media Source.
       openscreen::cast::RemotingCapabilities capabilities;
       InitMediaRemoter(capabilities);
+      // Hold off video and audio streaming while waiting for the session to
+      // switch to Remoting.
       video_capture_client_->Pause();
+      audio_input_device_->Stop();
       remote_playback_start_time_ = base::Time::Now();
       remote_playback_start_timer_.Start(
           FROM_HERE, kStartRemotePlaybackTimeOut,
diff --git a/components/mirroring/service/session.cc b/components/mirroring/service/session.cc
index c70b3e9..81985fd9 100644
--- a/components/mirroring/service/session.cc
+++ b/components/mirroring/service/session.cc
@@ -823,7 +823,10 @@
   if (initially_starting_session) {
     if (session_params_.is_remote_playback) {
       InitMediaRemoter({});
+      // Hold off video and audio streaming while waiting for the session to
+      // switch to Remoting.
       video_capture_client_->Pause();
+      audio_input_device_->Stop();
       remote_playback_start_time_ = base::Time::Now();
       remote_playback_start_timer_.Start(
           FROM_HERE, kStartRemotePlaybackTimeOut,
diff --git a/components/net_log/net_log_proxy_source.cc b/components/net_log/net_log_proxy_source.cc
index 9110259d..6530809 100644
--- a/components/net_log/net_log_proxy_source.cc
+++ b/components/net_log/net_log_proxy_source.cc
@@ -95,7 +95,7 @@
                                         base::TimeTicks source_start_time,
                                         net::NetLogEventPhase phase,
                                         base::TimeTicks time,
-                                        base::Value params) {
+                                        base::Value::Dict params) {
   proxy_sink_remote_->AddEntry(
       static_cast<uint32_t>(type), static_cast<uint32_t>(source_type),
       source_id, source_start_time, phase, time, std::move(params));
diff --git a/components/net_log/net_log_proxy_source.h b/components/net_log/net_log_proxy_source.h
index 05fc79b1..9e67689 100644
--- a/components/net_log/net_log_proxy_source.h
+++ b/components/net_log/net_log_proxy_source.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_NET_LOG_NET_LOG_PROXY_SOURCE_H_
 
 #include "base/memory/weak_ptr.h"
+#include "base/values.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/log/net_log.h"
@@ -54,7 +55,7 @@
                        base::TimeTicks source_start_time,
                        net::NetLogEventPhase phase,
                        base::TimeTicks time,
-                       base::Value params);
+                       base::Value::Dict params);
 
   mojo::Receiver<network::mojom::NetLogProxySource> proxy_source_receiver_;
   mojo::Remote<network::mojom::NetLogProxySink> proxy_sink_remote_;
diff --git a/components/net_log/net_log_proxy_source_unittest.cc b/components/net_log/net_log_proxy_source_unittest.cc
index 78e8947e..7d8ac9c 100644
--- a/components/net_log/net_log_proxy_source_unittest.cc
+++ b/components/net_log/net_log_proxy_source_unittest.cc
@@ -33,7 +33,7 @@
                  base::TimeTicks source_start_time,
                  net::NetLogEventPhase phase,
                  base::TimeTicks time,
-                 base::Value params)
+                 base::Value::Dict params)
         : type(type),
           source_type(source_type),
           source_id(source_id),
@@ -57,7 +57,7 @@
     base::TimeTicks source_start_time;
     net::NetLogEventPhase phase;
     base::TimeTicks time;
-    base::Value params;
+    base::Value::Dict params;
   };
 
   std::vector<ProxiedEntry> entries() const {
@@ -74,7 +74,7 @@
                 base::TimeTicks source_start_time,
                 net::NetLogEventPhase phase,
                 base::TimeTicks time,
-                base::Value params) override {
+                base::Value::Dict params) override {
     base::AutoLock lock(lock_);
     entries_.emplace_back(type, source_type, source_id, source_start_time,
                           phase, time, std::move(params));
@@ -123,7 +123,8 @@
   base::RunLoop run_loop_;
 };
 
-base::Value NetLogCaptureModeToParams(net::NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogCaptureModeToParams(
+    net::NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   switch (capture_mode) {
     case net::NetLogCaptureMode::kDefault:
@@ -136,7 +137,7 @@
       dict.Set("capture_mode", "kEverything");
       break;
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
@@ -221,7 +222,7 @@
   EXPECT_EQ(source1_start_ticks, entries[0].source_start_time);
   EXPECT_EQ(net::NetLogEventPhase::BEGIN, entries[0].phase);
   EXPECT_EQ(source1_event0_ticks, entries[0].time);
-  EXPECT_TRUE(entries[0].params.is_none());
+  EXPECT_TRUE(entries[0].params.empty());
 
   EXPECT_EQ(static_cast<uint32_t>(net::NetLogEventType::SOCKET_ALIVE),
             entries[1].type);
@@ -231,7 +232,7 @@
   EXPECT_EQ(source1_start_ticks, entries[1].source_start_time);
   EXPECT_EQ(net::NetLogEventPhase::END, entries[1].phase);
   EXPECT_EQ(source1_event1_ticks, entries[1].time);
-  EXPECT_TRUE(entries[1].params.is_none());
+  EXPECT_TRUE(entries[1].params.empty());
 }
 
 TEST(NetLogProxySource, ProxiesParamsOfLeastSensitiveCaptureMode) {
@@ -294,10 +295,8 @@
             entries[0].source_type);
   EXPECT_EQ(source0.source().id, entries[0].source_id);
   EXPECT_EQ(net::NetLogEventPhase::BEGIN, entries[0].phase);
-  ASSERT_TRUE(entries[0].params.is_dict());
-  EXPECT_EQ(1U, entries[0].params.DictSize());
-  const std::string* param =
-      entries[0].params.GetDict().FindString("capture_mode");
+  EXPECT_EQ(1U, entries[0].params.size());
+  const std::string* param = entries[0].params.FindString("capture_mode");
   ASSERT_TRUE(param);
   EXPECT_EQ("kIncludeSensitive", *param);
 
@@ -307,9 +306,8 @@
             entries[1].source_type);
   EXPECT_EQ(source0.source().id, entries[1].source_id);
   EXPECT_EQ(net::NetLogEventPhase::NONE, entries[1].phase);
-  ASSERT_TRUE(entries[1].params.is_dict());
-  EXPECT_EQ(1U, entries[1].params.DictSize());
-  param = entries[1].params.GetDict().FindString("capture_mode");
+  EXPECT_EQ(1U, entries[1].params.size());
+  param = entries[1].params.FindString("capture_mode");
   ASSERT_TRUE(param);
   EXPECT_EQ("kDefault", *param);
 
@@ -319,9 +317,8 @@
             entries[2].source_type);
   EXPECT_EQ(source0.source().id, entries[2].source_id);
   EXPECT_EQ(net::NetLogEventPhase::END, entries[2].phase);
-  ASSERT_TRUE(entries[2].params.is_dict());
-  EXPECT_EQ(1U, entries[2].params.DictSize());
-  param = entries[2].params.GetDict().FindString("capture_mode");
+  EXPECT_EQ(1U, entries[2].params.size());
+  param = entries[2].params.FindString("capture_mode");
   ASSERT_TRUE(param);
   EXPECT_EQ("kDefault", *param);
 }
diff --git a/components/offline_pages/core/archive_validator_unittest.cc b/components/offline_pages/core/archive_validator_unittest.cc
index c46d901..e987ec5 100644
--- a/components/offline_pages/core/archive_validator_unittest.cc
+++ b/components/offline_pages/core/archive_validator_unittest.cc
@@ -100,7 +100,7 @@
     return base::FilePath();
   base::FilePath temp_file_path =
       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("foo.txt"));
-  base::WriteFile(temp_file_path, content.c_str(), content.length());
+  base::WriteFile(temp_file_path, content);
   return temp_file_path;
 }
 
diff --git a/components/offline_pages/core/model/offline_page_model_utils_unittest.cc b/components/offline_pages/core/model/offline_page_model_utils_unittest.cc
index 95f46b8..db47e5f0 100644
--- a/components/offline_pages/core/model/offline_page_model_utils_unittest.cc
+++ b/components/offline_pages/core/model/offline_page_model_utils_unittest.cc
@@ -87,7 +87,7 @@
     base::FilePath path = model_utils::GenerateUniqueFilenameForOfflinePage(
         test_case.page_title, test_case.page_url, temp_dir.GetPath());
     // Writing a dummy file so the uniquifier can increase.
-    base::WriteFile(path, nullptr, 0);
+    base::WriteFile(path, base::StringPiece());
     EXPECT_EQ(path.BaseName().value(), test_case.expected_basename);
   }
 }
diff --git a/components/offline_pages/core/prefetch/test_download_service.cc b/components/offline_pages/core/prefetch/test_download_service.cc
index 34cfbb7..80774e4 100644
--- a/components/offline_pages/core/prefetch/test_download_service.cc
+++ b/components/offline_pages/core/prefetch/test_download_service.cc
@@ -69,8 +69,7 @@
 void TestDownloadService::FinishDownload(const std::string& guid) {
   base::FilePath path = download_dir_.GetPath().AppendASCII(
       base::StrCat({"dl_", base::NumberToString(next_file_id_++)}));
-  const int file_size = static_cast<int>(test_file_data_.size());
-  CHECK_EQ(file_size, base::WriteFile(path, test_file_data_.data(), file_size));
+  CHECK(base::WriteFile(path, test_file_data_));
   client_->OnDownloadSucceeded(
       guid, download::CompletionInfo(path, test_file_data_.size(),
                                      std::vector<GURL>(), nullptr));
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index df3fdf6..330a4480 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -119,31 +119,6 @@
 // The field number for the string value in ExperimentStatsV2.
 constexpr char kStringValueFieldNumber[] = "2";
 
-constexpr auto kPolarisGroupIdsMap =
-    base::MakeFixedFlatMap<int, omnibox::GroupId>(
-        {{0, omnibox::GROUP_PREVIOUS_SEARCH_RELATED},
-         {1, omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS},
-         {2, omnibox::GROUP_TRENDS},
-         {3, omnibox::GROUP_TRENDS_ENTITY_CHIPS},
-         {4, omnibox::GROUP_RELATED_QUERIES},
-         {5, omnibox::GROUP_VISITED_DOC_RELATED}});
-
-// Dynamically assigns a group ID known to Chrome for the given |group_id| based
-// on its 0-based |group_index| in the server response.
-// omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST is an exception and retains its
-// server provided ID.
-omnibox::GroupId ChromeGroupIdForRemoteGroupIdAndIndex(const int group_id,
-                                                       const int group_index) {
-  if (group_id == omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST) {
-    return omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST;
-  } else if (base::Contains(kPolarisGroupIdsMap, group_index)) {
-    return kPolarisGroupIdsMap.at(group_index);
-  } else {
-    // Return an invalid group ID if we don't have any reserved IDs left.
-    return omnibox::GROUP_INVALID;
-  }
-}
-
 constexpr auto kReservedReservedGroupSectionsMap =
     base::MakeFixedFlatMap<int, omnibox::GroupSection>(
         {{0, omnibox::SECTION_REMOTE_ZPS_1},
@@ -582,7 +557,6 @@
   int prefetch_index = -1;
   int prerender_index = -1;
   omnibox::GroupsInfo groups_info;
-  bool groups_info_parsed_from_proto = false;
 
   if (root_list.size() > 4u && root_list[4].is_dict()) {
     const base::Value& extras = root_list[4];
@@ -637,35 +611,7 @@
     }
 
     const auto* groups_info_string = extras.FindStringKey("google:groupsinfo");
-    groups_info_parsed_from_proto = DecodeProtoFromBase64<omnibox::GroupsInfo>(
-        groups_info_string, groups_info);
-
-    const base::Value* header_texts = extras.FindDictKey("google:headertexts");
-    if (!groups_info_parsed_from_proto && header_texts) {
-      const base::Value* headers = header_texts->FindDictKey("a");
-      if (headers) {
-        for (auto it : headers->DictItems()) {
-          int suggestion_group_id;
-          if (base::StringToInt(it.first, &suggestion_group_id) &&
-              it.second.is_string()) {
-            (*groups_info.mutable_group_configs())[suggestion_group_id]
-                .set_header_text(it.second.GetString());
-          }
-        }
-      }
-
-      const base::Value* hidden_group_ids = header_texts->FindListKey("h");
-      if (hidden_group_ids) {
-        for (const auto& value : hidden_group_ids->GetList()) {
-          if (value.is_int()) {
-            auto it = groups_info.mutable_group_configs()->find(value.GetInt());
-            if (it != groups_info.mutable_group_configs()->end()) {
-              it->second.set_visibility(omnibox::GroupConfig_Visibility_HIDDEN);
-            }
-          }
-        }
-      }
-    }
+    DecodeProtoFromBase64<omnibox::GroupsInfo>(groups_info_string, groups_info);
 
     const base::Value* client_data = extras.FindDictKey("google:clientdata");
     if (client_data) {
@@ -869,66 +815,40 @@
       }
 
       if (suggestion_group_id) {
-        // Do not use omnibox::GroupIdForNumber() because |suggestion_group_id|
-        // may not be present in omnibox::GroupId. However, casting int values
-        // into omnibox::GroupId enum without testing membership is expected to
-        // be safe as omnibox::GroupId enum has a fixed int underlying type.
-        // TODO(crbug.com/1343512): Use omnibox::GroupIdForNumber() once the
-        //  server response migrates to a serialized omnibox::GroupsInfo proto.
         results->suggest_results.back().set_suggestion_group_id(
-            static_cast<omnibox::GroupId>(*suggestion_group_id));
+            omnibox::GroupIdForNumber(*suggestion_group_id));
       }
     }
   }
 
   results->relevances_from_server = relevances != nullptr;
 
-  // Keeps the mapping from server-provided group IDs to those known to Chrome.
-  std::unordered_map<omnibox::GroupId, omnibox::GroupId> chrome_group_ids_map;
+  // Keeps track of the position of the server-provided group IDs.
+  size_t group_index = 0;
 
   // Adds the given group config to the results for the given group ID. Returns
   // true if the entry was added to or was already present in the results.
   auto add_group_config = [&](const omnibox::GroupId suggestion_group_id,
                               const omnibox::GroupConfig& group_config) {
-    // The group config is already added if the group ID was seen before.
-    if (base::Contains(chrome_group_ids_map, suggestion_group_id)) {
-      return true;
-    }
-
-    // Assign a 0-based index to the group based on the number of groups so far.
-    const int group_index = chrome_group_ids_map.size();
-
-    // Convert the server-provided group ID to one known to Chrome; unless
-    // |groups_info| is parsed from a serialized proto in "google:groupsinfo",
-    // in which case server-provided group IDs are present in omnibox::GroupId.
-    // TODO(crbug.com/1343512): Simplify this logic once the server response has
-    // migrated to a serialized omnibox::GroupsInfo in "google:groupsinfo".
-    const auto chrome_group_id = groups_info_parsed_from_proto
-                                     ? suggestion_group_id
-                                     : ChromeGroupIdForRemoteGroupIdAndIndex(
-                                           suggestion_group_id, group_index);
-
-    // Do not add the group config if Chrome ran out of group IDs to assign or
-    // if the group ID was invalid to begin with.
-    if (chrome_group_id == omnibox::GROUP_INVALID) {
+    // Do not add the group config if the group ID is invalid or unknown to
+    // Chrome.
+    if (suggestion_group_id == omnibox::GROUP_INVALID) {
       return false;
     }
 
-    // Remember the conversion.
-    chrome_group_ids_map[suggestion_group_id] = chrome_group_id;
-
     // There is nothing to do if the group config has been added before.
-    if (base::Contains(results->suggestion_groups_map, chrome_group_id)) {
+    if (base::Contains(results->suggestion_groups_map, suggestion_group_id)) {
       return true;
     }
 
     // Store the group config with the appropriate section in the results.
-    results->suggestion_groups_map[chrome_group_id].MergeFrom(group_config);
-    results->suggestion_groups_map[chrome_group_id].set_section(
-        ChromeGroupSectionForRemoteGroupIndex(group_index));
+    results->suggestion_groups_map[suggestion_group_id].MergeFrom(group_config);
+    results->suggestion_groups_map[suggestion_group_id].set_section(
+        ChromeGroupSectionForRemoteGroupIndex(group_index++));
     return true;
   };
 
+  // Add the group configs associated with the suggestions.
   for (auto& suggest_result : results->suggest_results) {
     if (!suggest_result.suggestion_group_id().has_value()) {
       continue;
@@ -939,17 +859,12 @@
 
     // Add the group config associated with the suggestion, if the suggestion
     // has a valid group ID and a corresponding group config is found in the
-    // response. Note that a group ID is deemed invalid if Chrome runs out of
-    // group IDs to assign or if the group ID was invalid to begin with.
+    // response.
     if (!base::Contains(groups_info.group_configs(), suggestion_group_id) ||
         !add_group_config(suggestion_group_id, groups_info.group_configs().at(
                                                    suggestion_group_id))) {
       continue;
     }
-
-    // Update the group ID in the suggestion.
-    suggest_result.set_suggestion_group_id(
-        chrome_group_ids_map[suggestion_group_id]);
   }
 
   // Add the remaining group configs without any suggestions in the response.
@@ -957,13 +872,7 @@
   // produced by Chrome and relies on the server-provided group config to show
   // with the appropriate header text, where a header text is applicable.
   for (const auto& entry : groups_info.group_configs()) {
-    // Do not use omnibox::GroupIdForNumber() because |groups_info| keys may not
-    // be present in omnibox::GroupId. However, casting int values into
-    // omnibox::GroupId enum without testing membership is expected to be safe
-    // as omnibox::GroupId enum has a fixed int underlying type.
-    // TODO(crbug.com/1343512): Use omnibox::GroupIdForNumber() once the server
-    //  response migrates to a serialized omnibox::GroupsInfo proto.
-    add_group_config(static_cast<omnibox::GroupId>(entry.first), entry.second);
+    add_group_config(omnibox::GroupIdForNumber(entry.first), entry.second);
   }
 
   return true;
diff --git a/components/omnibox/browser/search_suggestion_parser_unittest.cc b/components/omnibox/browser/search_suggestion_parser_unittest.cc
index e767e89..c7ed0fc 100644
--- a/components/omnibox/browser/search_suggestion_parser_unittest.cc
+++ b/components/omnibox/browser/search_suggestion_parser_unittest.cc
@@ -362,407 +362,6 @@
   EXPECT_EQ(kNone, result.match_contents_class());
 }
 
-TEST(SearchSuggestionParserTest, ParseSuggestionGroupInfo) {
-  TestSchemeClassifier scheme_classifier;
-  AutocompleteInput input(u"", metrics::OmniboxEventProto::NTP_REALBOX,
-                          scheme_classifier);
-
-  {
-    std::string json_data = R"([
-      "",
-      ["los angeles", "san diego", "las vegas", "san francisco"],
-      ["", "history", "", ""],
-      [],
-      {
-        "google:clientdata": {
-          "bpc": false,
-          "tlw": false
-        },
-        "google:headertexts":{
-          "a":{
-            "40000":"Recent Searches",
-            "40008":"Recommended for you",
-            "garbage_non_int":"NOT RECOMMENDED FOR YOU"
-          },
-          "h":[40000, "40008", "garbage_non_int"]
-        },
-        "google:suggestdetail":[
-          {
-          },
-          {
-            "zl":40000
-          },
-          {
-            "zl":40008
-          },
-          {
-            "zl":40009
-          }
-        ],
-        "google:suggestrelevance": [607, 606, 605, 604],
-        "google:suggesttype": ["QUERY", "PERSONALIZED_QUERY", "QUERY", "QUERY"]
-      }])";
-    absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
-    ASSERT_TRUE(root_val);
-
-    SearchSuggestionParser::Results results;
-    ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults(
-        *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
-        /*is_keyword_result=*/false, &results));
-
-    // Suggestion group headers, original group ids, sections, and default
-    // visibilities are correctly parsed and populated.
-    ASSERT_EQ(2U, results.suggestion_groups_map.size());
-
-    ASSERT_EQ(
-        "Recent Searches",
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .header_text());
-    ASSERT_EQ(
-        omnibox::SECTION_REMOTE_ZPS_1,
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .section());
-    ASSERT_EQ(
-        omnibox::GroupConfig_Visibility_HIDDEN,
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .visibility());
-
-    ASSERT_EQ("Recommended for you",
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .header_text());
-    ASSERT_EQ(omnibox::GroupConfig_Visibility_DEFAULT_VISIBLE,
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .visibility());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_2,
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .section());
-
-    ASSERT_EQ(u"los angeles", results.suggest_results[0].suggestion());
-    // This suggestion does not belong to a group.
-    ASSERT_EQ(absl::nullopt, results.suggest_results[0].suggestion_group_id());
-
-    ASSERT_EQ(u"san diego", results.suggest_results[1].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST,
-              *results.suggest_results[1].suggestion_group_id());
-
-    ASSERT_EQ(u"las vegas", results.suggest_results[2].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS,
-              *results.suggest_results[2].suggestion_group_id());
-
-    ASSERT_EQ(u"san francisco", results.suggest_results[3].suggestion());
-    ASSERT_EQ(static_cast<omnibox::GroupId>(40009),
-              results.suggest_results[3].suggestion_group_id());
-  }
-  {
-    std::string json_data = R"([
-      "",
-      ["los angeles", "san diego", "las vegas", "san francisco"],
-      ["", "", "history", ""],
-      [],
-      {
-        "google:clientdata": {
-          "bpc": false,
-          "tlw": false
-        },
-        "google:headertexts":{
-          "a":{
-            "40000":"Recent Searches",
-            "40008":"Recommended for you",
-            "40009": 123
-          },
-          "h":[40000, "40008", 40009]
-        },
-        "google:suggestdetail":[
-          {
-            "zl":40008
-          },
-          {
-            "zl":40008
-          },
-          {
-            "zl":40000
-          },
-          {
-            "zl":40009
-          }
-        ],
-        "google:suggestrelevance": [607, 606, 605, 604],
-        "google:suggesttype": ["QUERY", "QUERY", "PERSONALIZED_QUERY", "QUERY"]
-      }])";
-    absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
-    ASSERT_TRUE(root_val);
-
-    SearchSuggestionParser::Results results;
-    ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults(
-        *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
-        /*is_keyword_result=*/false, &results));
-
-    // Suggestion group headers, original group ids, sections, and default
-    // visibilities are correctly parsed and populated.
-    ASSERT_EQ(2U, results.suggestion_groups_map.size());
-
-    ASSERT_EQ(
-        "Recommended for you",
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .header_text());
-    ASSERT_EQ(
-        omnibox::GroupConfig_Visibility_DEFAULT_VISIBLE,
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .visibility());
-    ASSERT_EQ(
-        omnibox::SECTION_REMOTE_ZPS_1,
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .section());
-
-    ASSERT_EQ(
-        "Recent Searches",
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .header_text());
-    ASSERT_EQ(
-        omnibox::SECTION_REMOTE_ZPS_2,
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .section());
-    ASSERT_EQ(
-        omnibox::GroupConfig_Visibility_HIDDEN,
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST]
-            .visibility());
-
-    ASSERT_EQ(u"los angeles", results.suggest_results[0].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED,
-              *results.suggest_results[0].suggestion_group_id());
-
-    ASSERT_EQ(u"san diego", results.suggest_results[1].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED,
-              *results.suggest_results[1].suggestion_group_id());
-
-    ASSERT_EQ(u"las vegas", results.suggest_results[2].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST,
-              *results.suggest_results[2].suggestion_group_id());
-
-    ASSERT_EQ(u"san francisco", results.suggest_results[3].suggestion());
-    ASSERT_EQ(static_cast<omnibox::GroupId>(40009),
-              results.suggest_results[3].suggestion_group_id());
-  }
-  {
-    std::string json_data = R"([
-      "",
-      ["los angeles", "san diego", "las vegas", "san francisco"],
-      ["", "", "", "history"],
-      [],
-      {
-        "google:clientdata": {
-          "bpc": false,
-          "tlw": false
-        },
-        "google:headertexts":{
-          "a":{
-            "40007":"Related Searches",
-            "40008":"Recommended for you",
-            "40009":"NOT RECOMMENDED FOR YOU"
-          },
-          "h":[40007, "40008", "garbage_non_int"]
-        },
-        "google:suggestdetail":[
-          {
-            "zl":40008
-          },
-          {
-            "zl":40007
-          },
-          {
-            "zl":40008
-          },
-          {
-            "zl":40000
-          }
-        ],
-        "google:suggestrelevance": [607, 606, 605, 604],
-        "google:suggesttype": ["QUERY", "QUERY", "QUERY", "PERSONALIZED_QUERY"]
-      }])";
-    absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
-    ASSERT_TRUE(root_val);
-
-    SearchSuggestionParser::Results results;
-    ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults(
-        *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
-        /*is_keyword_result=*/false, &results));
-
-    // Suggestion group headers, original group ids, sections, and default
-    // visibilities are correctly parsed and populated.
-    ASSERT_EQ(3U, results.suggestion_groups_map.size());
-
-    ASSERT_EQ(
-        "Recommended for you",
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .header_text());
-    ASSERT_EQ(
-        omnibox::SECTION_REMOTE_ZPS_1,
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .section());
-    ASSERT_EQ(
-        omnibox::GroupConfig_Visibility_DEFAULT_VISIBLE,
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED]
-            .visibility());
-
-    ASSERT_EQ("Related Searches",
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .header_text());
-    ASSERT_EQ(omnibox::GroupConfig_Visibility_HIDDEN,
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .visibility());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_2,
-              results
-                  .suggestion_groups_map
-                      [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS]
-                  .section());
-
-    ASSERT_EQ(
-        "NOT RECOMMENDED FOR YOU",
-        results.suggestion_groups_map[omnibox::GROUP_TRENDS].header_text());
-    ASSERT_EQ(
-        omnibox::GroupConfig_Visibility_DEFAULT_VISIBLE,
-        results.suggestion_groups_map[omnibox::GROUP_TRENDS].visibility());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_3,
-              results.suggestion_groups_map[omnibox::GROUP_TRENDS].section());
-
-    ASSERT_EQ(u"los angeles", results.suggest_results[0].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED,
-              *results.suggest_results[0].suggestion_group_id());
-
-    ASSERT_EQ(u"san diego", results.suggest_results[1].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS,
-              *results.suggest_results[1].suggestion_group_id());
-
-    ASSERT_EQ(u"las vegas", results.suggest_results[2].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED,
-              *results.suggest_results[2].suggestion_group_id());
-
-    ASSERT_EQ(u"san francisco", results.suggest_results[3].suggestion());
-    ASSERT_EQ(static_cast<omnibox::GroupId>(40000),
-              results.suggest_results[3].suggestion_group_id());
-  }
-  {
-    std::string json_data = R"([
-    "",
-    [
-      "1",
-      "2",
-      "3",
-      "4",
-      "5",
-      "6",
-      "7"
-    ],
-    [
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      ""
-    ],
-    [],
-    {
-      "google:clientdata":{
-        "bpc":false,
-        "tlw":false
-      },
-      "google:headertexts":{
-        "a":{
-          "40000":"1",
-          "40001":"2",
-          "40002":"3",
-          "40003":"4",
-          "40004":"5",
-          "40005":"6",
-          "40006":"7"
-        },
-        "h":[
-          40005,
-          "40006",
-          "garbage_non_int"
-        ]
-      },
-      "google:suggestdetail":[
-        {
-          "zl":40000
-        },
-        {
-          "zl":40001
-        },
-        {
-          "zl":40002
-        },
-        {
-          "zl":40003
-        },
-        {
-          "zl":40004
-        },
-        {
-          "zl":40005
-        },
-        {
-          "zl":40006
-        }
-      ],
-      "google:suggestrelevance":[
-        611,
-        610,
-        609,
-        608,
-        607,
-        606,
-        605
-      ],
-      "google:suggesttype":[
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY"
-      ]
-    }])";
-    absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
-    ASSERT_TRUE(root_val);
-
-    SearchSuggestionParser::Results results;
-    ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults(
-        *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
-        /*is_keyword_result=*/false, &results));
-
-    // Suggestion group headers, original group ids, sections, and default
-    // visibilities are correctly parsed and populated.
-    ASSERT_EQ(6U, results.suggestion_groups_map.size());
-    ASSERT_EQ(7U, results.suggest_results.size());
-    ASSERT_EQ(omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST,
-              *results.suggest_results[0].suggestion_group_id());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS,
-              *results.suggest_results[1].suggestion_group_id());
-    ASSERT_EQ(omnibox::GROUP_TRENDS_ENTITY_CHIPS,
-              *results.suggest_results[3].suggestion_group_id());
-    ASSERT_EQ(omnibox::GROUP_RELATED_QUERIES,
-              *results.suggest_results[4].suggestion_group_id());
-    ASSERT_EQ(omnibox::GROUP_VISITED_DOC_RELATED,
-              *results.suggest_results[5].suggestion_group_id());
-    ASSERT_EQ(static_cast<omnibox::GroupId>(40006),
-              results.suggest_results[6].suggestion_group_id());
-  }
-}
-
 TEST(SearchSuggestionParserTest, ParseSuggestionEntityInfo) {
   TestSchemeClassifier scheme_classifier;
   AutocompleteInput input(u"the m", metrics::OmniboxEventProto::NTP_REALBOX,
@@ -856,7 +455,7 @@
             results.suggest_results[2].entity_info().entity_id());
 }
 
-TEST(SearchSuggestionParserTest, ParseSuggestionGroupInfo_FromProto) {
+TEST(SearchSuggestionParserTest, ParseSuggestionGroupInfo) {
   TestSchemeClassifier scheme_classifier;
   AutocompleteInput input(u"", metrics::OmniboxEventProto::NTP_REALBOX,
                           scheme_classifier);
@@ -881,14 +480,6 @@
           "bpc": false,
           "tlw": false
         },
-        "google:headertexts":{
-          "a":{
-            "10000":"Related Entities",
-            "10001":"Trending Searches",
-            "40000":"Recent Searches"
-          },
-          "h":[10000, "10001"]
-        },
         "google:groupsinfo": ")" +
                             SerializeAndEncodeGroupsInfo(groups_info) + R"(",
         "google:suggestdetail":[
@@ -947,25 +538,32 @@
               *results.suggest_results[2].suggestion_group_id());
 
     ASSERT_EQ(u"san francisco", results.suggest_results[3].suggestion());
-    ASSERT_EQ(static_cast<omnibox::GroupId>(40000),
+    ASSERT_EQ(omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST,
               results.suggest_results[3].suggestion_group_id());
   }
   {
     omnibox::GroupsInfo groups_info;
     auto* group_configs_map = groups_info.mutable_group_configs();
-    auto& group_config_1 = (*group_configs_map)
+    // Group 1
+    auto& group_config_1 = (*group_configs_map)[omnibox::GROUP_TRENDS];
+    group_config_1.set_header_text("Trending Searches");
+    group_config_1.set_visibility(omnibox::GroupConfig_Visibility_HIDDEN);
+    // Group 2
+    auto& group_config_2 = (*group_configs_map)
         [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS];
-    group_config_1.set_header_text("Related Entities");
-    auto& group_config_2 = (*group_configs_map)[omnibox::GROUP_TRENDS];
-    group_config_2.set_header_text("Trending Searches");
-    group_config_2.set_visibility(omnibox::GroupConfig_Visibility_HIDDEN);
+    group_config_2.set_header_text("Related Entities");
+    // Group 3
     auto& group_config_3 =
         (*group_configs_map)[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST];
     group_config_3.set_header_text("Recent Searches");
+    // Group 4
+    auto& group_config_4 =
+        (*group_configs_map)[static_cast<omnibox::GroupId>(101)];
+    group_config_4.set_header_text("Unrecognized Suggestions");
 
     std::string json_data = R"([
       "",
-      ["los angeles", "san diego", "las vegas", "san francisco"],
+      ["los angeles", "san diego", "las vegas", "san francisco", "sacramento"],
       ["", "history", "", ""],
       [],
       {
@@ -973,13 +571,6 @@
           "bpc": false,
           "tlw": false
         },
-        "google:headertexts":{
-          "a":{
-            "10000":"Related Entities",
-            "10001":"Trending Searches"
-          },
-          "h":[10000, "10001"]
-        },
         "google:groupsinfo": ")" +
                             SerializeAndEncodeGroupsInfo(groups_info) + R"(",
         "google:suggestdetail":[
@@ -992,10 +583,14 @@
             "zl":10001
           },
           {
+            "zl":102
+          },
+          {
+            "zl":101
           }
         ],
-        "google:suggestrelevance": [607, 606, 605, 604],
-        "google:suggesttype": ["QUERY", "PERSONALIZED_QUERY", "QUERY", "QUERY"]
+        "google:suggestrelevance": [607, 606, 605, 604, 603],
+        "google:suggesttype": ["QUERY", "QUERY", "QUERY", "QUERY", "QUERY"]
       }])";
     absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
     ASSERT_TRUE(root_val);
@@ -1005,29 +600,30 @@
         *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
         /*is_keyword_result=*/false, &results));
 
-    // Ensure suggestion groups are correctly parsed from the serialized proto.
+    // Ensure group configs are correctly parsed from the serialized proto.
+    // group configs with invalid or unrecognized group IDs are dropped.
     ASSERT_EQ(3U, results.suggestion_groups_map.size());
-
-    const auto& group_1 = results.suggestion_groups_map[omnibox::GROUP_TRENDS];
+    // Group 1
+    const auto& group_1 =
+        results.suggestion_groups_map.at(omnibox::GROUP_TRENDS);
     ASSERT_EQ("Trending Searches", group_1.header_text());
     ASSERT_EQ(omnibox::GroupConfig_Visibility_HIDDEN, group_1.visibility());
     ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_1, group_1.section());
-
-    const auto& group_2 =
-        results.suggestion_groups_map
-            [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS];
+    // Group 2
+    const auto& group_2 = results.suggestion_groups_map.at(
+        omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS);
     ASSERT_EQ("Related Entities", group_2.header_text());
     ASSERT_EQ(omnibox::GroupConfig_Visibility_DEFAULT_VISIBLE,
               group_2.visibility());
     ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_2, group_2.section());
-
-    const auto& group_3 =
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST];
+    // Group 3
+    const auto& group_3 = results.suggestion_groups_map.at(
+        omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST);
     ASSERT_EQ("Recent Searches", group_3.header_text());
     ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_3, group_3.section());
 
     // Ensure suggestion group IDs are correctly set in the suggestions.
-    ASSERT_EQ(4U, results.suggest_results.size());
+    ASSERT_EQ(5U, results.suggest_results.size());
 
     ASSERT_EQ(u"los angeles", results.suggest_results[0].suggestion());
     // This suggestion does not belong to a group.
@@ -1042,196 +638,14 @@
               *results.suggest_results[2].suggestion_group_id());
 
     ASSERT_EQ(u"san francisco", results.suggest_results[3].suggestion());
-    // This suggestion does not belong to a group.
-    ASSERT_EQ(absl::nullopt, results.suggest_results[3].suggestion_group_id());
-  }
-  {
-    omnibox::GroupsInfo groups_info;
-    auto* group_configs_map = groups_info.mutable_group_configs();
-    auto& group_config_1 =
-        (*group_configs_map)[omnibox::GROUP_PREVIOUS_SEARCH_RELATED];
-    group_config_1.set_header_text("Related Searches");
-    auto& group_config_2 = (*group_configs_map)
-        [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS];
-    group_config_2.set_header_text("Related Entities");
-    auto& group_config_3 = (*group_configs_map)[omnibox::GROUP_TRENDS];
-    group_config_3.set_header_text("Trending Searches");
-    auto& group_config_4 =
-        (*group_configs_map)[omnibox::GROUP_TRENDS_ENTITY_CHIPS];
-    group_config_4.set_header_text("Trending Entities");
-    auto& group_config_5 = (*group_configs_map)[omnibox::GROUP_RELATED_QUERIES];
-    group_config_5.set_header_text("Related Questions");
-    auto& group_config_6 =
-        (*group_configs_map)[omnibox::GROUP_VISITED_DOC_RELATED];
-    group_config_6.set_header_text("Related To Websites");
-    auto& group_config_7 =
-        (*group_configs_map)[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST];
-    group_config_7.set_header_text("Recent Searches");
-    auto& group_config_8 =
-        (*group_configs_map)[omnibox::GROUP_POLARIS_RESERVED_MAX];
-    group_config_8.set_header_text("Uknown Group");
+    // This suggestion belongs to an unrecognized group.
+    ASSERT_EQ(omnibox::GROUP_INVALID,
+              results.suggest_results[3].suggestion_group_id());
 
-    std::string json_data = R"([
-    "",
-    [
-      "1",
-      "2",
-      "3",
-      "4",
-      "5",
-      "6",
-      "7",
-      "8"
-    ],
-    [
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      "",
-      ""
-    ],
-    [],
-    {
-      "google:clientdata":{
-        "bpc":false,
-        "tlw":false
-      },
-      "google:groupsinfo": ")" +
-                            SerializeAndEncodeGroupsInfo(groups_info) + R"(",
-      "google:suggestdetail":[
-        {
-          "zl":10000
-        },
-        {
-          "zl":10001
-        },
-        {
-          "zl":10002
-        },
-        {
-          "zl":10003
-        },
-        {
-          "zl":10004
-        },
-        {
-          "zl":10005
-        },
-        {
-          "zl":40000
-        },
-        {
-        }
-      ],
-      "google:suggestrelevance":[
-        611,
-        610,
-        609,
-        608,
-        607,
-        606,
-        605,
-        604
-      ],
-      "google:suggesttype":[
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY",
-        "QUERY"
-      ]
-    }])";
-    absl::optional<base::Value> root_val = base::JSONReader::Read(json_data);
-    ASSERT_TRUE(root_val);
-
-    SearchSuggestionParser::Results results;
-    ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults(
-        *root_val, input, scheme_classifier, /*default_result_relevance=*/400,
-        /*is_keyword_result=*/false, &results));
-
-    // Ensure suggestion groups are correctly parsed from the serialized proto.
-    ASSERT_EQ(8U, results.suggestion_groups_map.size());
-
-    const auto& group_1 =
-        results.suggestion_groups_map[omnibox::GROUP_PREVIOUS_SEARCH_RELATED];
-    ASSERT_EQ("Related Searches", group_1.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_1, group_1.section());
-
-    const auto& group_2 =
-        results.suggestion_groups_map
-            [omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS];
-    ASSERT_EQ("Related Entities", group_2.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_2, group_2.section());
-
-    const auto& group_3 = results.suggestion_groups_map[omnibox::GROUP_TRENDS];
-    ASSERT_EQ("Trending Searches", group_3.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_3, group_3.section());
-
-    const auto& group_4 =
-        results.suggestion_groups_map[omnibox::GROUP_TRENDS_ENTITY_CHIPS];
-    ASSERT_EQ("Trending Entities", group_4.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_4, group_4.section());
-
-    const auto& group_5 =
-        results.suggestion_groups_map[omnibox::GROUP_RELATED_QUERIES];
-    ASSERT_EQ("Related Questions", group_5.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_5, group_5.section());
-
-    const auto& group_6 =
-        results.suggestion_groups_map[omnibox::GROUP_VISITED_DOC_RELATED];
-    ASSERT_EQ("Related To Websites", group_6.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_6, group_6.section());
-
-    const auto& group_7 =
-        results.suggestion_groups_map[omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST];
-    ASSERT_EQ("Recent Searches", group_7.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_7, group_7.section());
-
-    const auto& group_8 =
-        results.suggestion_groups_map[omnibox::GROUP_POLARIS_RESERVED_MAX];
-    ASSERT_EQ("Uknown Group", group_8.header_text());
-    ASSERT_EQ(omnibox::SECTION_REMOTE_ZPS_8, group_8.section());
-
-    // Ensure suggestion group IDs are correctly set in the suggestions.
-    ASSERT_EQ(8U, results.suggest_results.size());
-
-    ASSERT_EQ(u"1", results.suggest_results[0].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED,
-              *results.suggest_results[0].suggestion_group_id());
-
-    ASSERT_EQ(u"2", results.suggest_results[1].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PREVIOUS_SEARCH_RELATED_ENTITY_CHIPS,
-              *results.suggest_results[1].suggestion_group_id());
-
-    ASSERT_EQ(u"3", results.suggest_results[2].suggestion());
-    ASSERT_EQ(omnibox::GROUP_TRENDS,
-              *results.suggest_results[2].suggestion_group_id());
-
-    ASSERT_EQ(u"4", results.suggest_results[3].suggestion());
-    ASSERT_EQ(omnibox::GROUP_TRENDS_ENTITY_CHIPS,
-              *results.suggest_results[3].suggestion_group_id());
-
-    ASSERT_EQ(u"5", results.suggest_results[4].suggestion());
-    ASSERT_EQ(omnibox::GROUP_RELATED_QUERIES,
-              *results.suggest_results[4].suggestion_group_id());
-
-    ASSERT_EQ(u"6", results.suggest_results[5].suggestion());
-    ASSERT_EQ(omnibox::GROUP_VISITED_DOC_RELATED,
-              *results.suggest_results[5].suggestion_group_id());
-
-    ASSERT_EQ(u"7", results.suggest_results[6].suggestion());
-    ASSERT_EQ(omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST,
-              *results.suggest_results[6].suggestion_group_id());
-
-    ASSERT_EQ(u"8", results.suggest_results[7].suggestion());
-    // This suggestion does not belong to a group.
-    ASSERT_EQ(absl::nullopt, results.suggest_results[7].suggestion_group_id());
+    ASSERT_EQ(u"sacramento", results.suggest_results[4].suggestion());
+    // This suggestion belongs to an unrecognized group.
+    ASSERT_EQ(omnibox::GROUP_INVALID,
+              results.suggest_results[4].suggestion_group_id());
   }
 }
 
diff --git a/components/optimization_guide/core/hints_component_util_unittest.cc b/components/optimization_guide/core/hints_component_util_unittest.cc
index 8d229ff..cd656b16 100644
--- a/components/optimization_guide/core/hints_component_util_unittest.cc
+++ b/components/optimization_guide/core/hints_component_util_unittest.cc
@@ -37,9 +37,7 @@
                          const proto::Configuration& config) {
     std::string serialized_config;
     ASSERT_TRUE(config.SerializeToString(&serialized_config));
-    ASSERT_EQ(static_cast<int32_t>(serialized_config.length()),
-              base::WriteFile(filePath, serialized_config.data(),
-                              serialized_config.length()));
+    ASSERT_TRUE(base::WriteFile(filePath, serialized_config));
   }
 
   base::FilePath temp_dir() const { return temp_dir_.GetPath(); }
@@ -86,7 +84,7 @@
 
 TEST_F(HintsComponentUtilTest, ProcessHintsComponentNotAConfigInFile) {
   const base::FilePath filePath = temp_dir().Append(kFileName);
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(filePath, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(filePath, "boo"));
 
   ProcessHintsComponentResult result;
   std::unique_ptr<proto::Configuration> config = ProcessHintsComponent(
diff --git a/components/optimization_guide/core/hints_manager_unittest.cc b/components/optimization_guide/core/hints_manager_unittest.cc
index 5bfafb4..bb0418b 100644
--- a/components/optimization_guide/core/hints_manager_unittest.cc
+++ b/components/optimization_guide/core/hints_manager_unittest.cc
@@ -364,7 +364,7 @@
     HintsComponentInfo info(
         base::Version(version),
         temp_dir().Append(FILE_PATH_LITERAL("badconfig.pb")));
-    ASSERT_EQ(7, base::WriteFile(info.path, "garbage", 7));
+    ASSERT_TRUE(base::WriteFile(info.path, "garbage"));
 
     hints_manager_->OnHintsComponentAvailable(info);
     RunUntilIdle();
@@ -481,9 +481,7 @@
                          const base::FilePath& filePath) {
     std::string serialized_config;
     ASSERT_TRUE(config.SerializeToString(&serialized_config));
-    ASSERT_EQ(static_cast<int32_t>(serialized_config.size()),
-              base::WriteFile(filePath, serialized_config.data(),
-                              serialized_config.size()));
+    ASSERT_TRUE(base::WriteFile(filePath, serialized_config));
   }
 
   base::test::TaskEnvironment task_environment_{
diff --git a/components/optimization_guide/core/optimization_guide_store_unittest.cc b/components/optimization_guide/core/optimization_guide_store_unittest.cc
index b9555fa..2c23bd0 100644
--- a/components/optimization_guide/core/optimization_guide_store_unittest.cc
+++ b/components/optimization_guide/core/optimization_guide_store_unittest.cc
@@ -2106,8 +2106,7 @@
   ASSERT_TRUE(update_data);
 
   base::FilePath model_file_path = temp_dir().AppendASCII("model.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3),
-            base::WriteFile(model_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(model_file_path, "boo"));
 
   base::FilePath additional_file_path = temp_dir().AppendASCII("doesntexist");
 
@@ -2166,13 +2165,11 @@
   ASSERT_TRUE(update_data);
 
   base::FilePath model_file_path = temp_dir().AppendASCII("model.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3),
-            base::WriteFile(model_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(model_file_path, "boo"));
 
   base::FilePath additional_file_path =
       temp_dir().AppendASCII("additional_file.txt");
-  ASSERT_EQ(static_cast<int32_t>(3),
-            base::WriteFile(additional_file_path, "ah!", 3));
+  ASSERT_TRUE(base::WriteFile(additional_file_path, "ah!"));
   proto::ModelInfo info;
   info.add_additional_files()->set_file_path(
       FilePathToString(additional_file_path));
@@ -2223,7 +2220,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data);
   base::FilePath file_path = temp_dir().AppendASCII("file");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(file_path, "boo"));
   SeedPredictionModelUpdateData(update_data.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 file_path);
@@ -2270,7 +2267,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data);
   base::FilePath old_file_path = old_dir.AppendASCII("model.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(old_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(old_file_path, "boo"));
   SeedPredictionModelUpdateData(update_data.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 old_file_path);
@@ -2287,7 +2284,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data2);
   base::FilePath new_file_path = new_dir.AppendASCII("model.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(new_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(new_file_path, "boo"));
   SeedPredictionModelUpdateData(update_data2.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 new_file_path);
@@ -2327,8 +2324,7 @@
 
   base::FilePath old_unassociated_model_path =
       old_dir.AppendASCII("other_model.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3),
-            base::WriteFile(old_unassociated_model_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(old_unassociated_model_path, "boo"));
 
   base::Time update_time = base::Time().Now();
   std::unique_ptr<StoreUpdateData> update_data =
@@ -2337,7 +2333,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data);
   base::FilePath old_file_path = old_dir.AppendASCII("model_v1.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(old_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(old_file_path, "boo"));
   SeedPredictionModelUpdateData(update_data.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 old_file_path);
@@ -2354,7 +2350,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data2);
   base::FilePath new_file_path = new_dir.Append(GetBaseFileNameForModels());
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(new_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(new_file_path, "boo"));
   SeedPredictionModelUpdateData(update_data2.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 new_file_path);
@@ -2394,7 +2390,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data);
   base::FilePath file_path = temp_dir().AppendASCII("file");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(file_path, "boo"));
   SeedPredictionModelUpdateData(update_data.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 file_path);
@@ -2447,7 +2443,7 @@
           optimization_guide::features::StoredModelsValidDuration());
   ASSERT_TRUE(update_data);
   base::FilePath old_file_path = temp_dir().AppendASCII("model_v1.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(old_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(old_file_path, "boo"));
   proto::ModelInfo model_info;
   model_info.set_version(123);
   SeedPredictionModelUpdateData(
@@ -2542,7 +2538,7 @@
   info.set_version(123);
   info.set_keep_beyond_valid_duration(test_case.keep_beyond_valid_duration);
   base::FilePath old_file_path = temp_dir().AppendASCII("model_v1.tflite");
-  ASSERT_EQ(static_cast<int32_t>(3), base::WriteFile(old_file_path, "boo", 3));
+  ASSERT_TRUE(base::WriteFile(old_file_path, "boo"));
   SeedPredictionModelUpdateData(update_data.get(),
                                 proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
                                 old_file_path, info, update_time);
diff --git a/components/optimization_guide/core/prediction_model_download_manager_unittest.cc b/components/optimization_guide/core/prediction_model_download_manager_unittest.cc
index 656d41c2..4e324d8 100644
--- a/components/optimization_guide/core/prediction_model_download_manager_unittest.cc
+++ b/components/optimization_guide/core/prediction_model_download_manager_unittest.cc
@@ -231,7 +231,7 @@
     ASSERT_TRUE(base::CreateDirectory(zip_dir));
     if (status ==
         PredictionModelDownloadFileStatus::kVerifiedCrxWithBadModelInfoFile) {
-      base::WriteFile(zip_dir.AppendASCII("model-info.pb"), "boo", 3);
+      base::WriteFile(zip_dir.AppendASCII("model-info.pb"), "boo");
     } else {
       proto::ModelInfo model_info;
       model_info.set_optimization_target(
@@ -244,13 +244,11 @@
 
       std::string serialized_model_info;
       ASSERT_TRUE(model_info.SerializeToString(&serialized_model_info));
-      ASSERT_EQ(static_cast<int32_t>(serialized_model_info.length()),
-                base::WriteFile(zip_dir.AppendASCII("model-info.pb"),
-                                serialized_model_info.data(),
-                                serialized_model_info.length()));
+      ASSERT_TRUE(base::WriteFile(zip_dir.AppendASCII("model-info.pb"),
+                                  serialized_model_info));
       if (status ==
           PredictionModelDownloadFileStatus::kVerifiedCrxWithGoodModelFiles) {
-        base::WriteFile(zip_dir.AppendASCII("model.tflite"), "model", 5);
+        base::WriteFile(zip_dir.AppendASCII("model.tflite"), "model");
       }
     }
     ASSERT_TRUE(
diff --git a/components/optimization_guide/core/test_hints_component_creator.cc b/components/optimization_guide/core/test_hints_component_creator.cc
index 8b7025b1..48ada1b 100644
--- a/components/optimization_guide/core/test_hints_component_creator.cc
+++ b/components/optimization_guide/core/test_hints_component_creator.cc
@@ -124,9 +124,7 @@
   std::string serialized_config;
   ASSERT_TRUE(config.SerializeToString(&serialized_config));
 
-  ASSERT_EQ(static_cast<int32_t>(serialized_config.length()),
-            base::WriteFile(file_path, serialized_config.data(),
-                            serialized_config.length()));
+  ASSERT_TRUE(base::WriteFile(file_path, serialized_config));
 }
 
 optimization_guide::HintsComponentInfo
diff --git a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
index 5c9a8ee..a31d0604 100644
--- a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
+++ b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
@@ -29,7 +29,7 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_use_local_config = false
 
diff --git a/components/ownership/owner_key_util_impl_unittest.cc b/components/ownership/owner_key_util_impl_unittest.cc
index ba72900..c00c309 100644
--- a/components/ownership/owner_key_util_impl_unittest.cc
+++ b/components/ownership/owner_key_util_impl_unittest.cc
@@ -70,10 +70,7 @@
   // Export public key, so that we can compare it to the one we get off disk.
   std::vector<uint8_t> public_key(kTestKeyData,
                                   kTestKeyData + sizeof(kTestKeyData));
-  ASSERT_EQ(static_cast<int>(public_key.size()),
-            base::WriteFile(key_file_,
-                            reinterpret_cast<const char*>(public_key.data()),
-                            public_key.size()));
+  ASSERT_TRUE(base::WriteFile(key_file_, public_key));
   EXPECT_TRUE(util_->IsPublicKeyPresent());
 
   scoped_refptr<PublicKey> from_disk = util_->ImportPublicKey();
@@ -89,7 +86,7 @@
   EXPECT_FALSE(util_->ImportPublicKey());
 
   // Next try empty file. This should fail as well.
-  ASSERT_EQ(0, base::WriteFile(key_file_, "", 0));
+  ASSERT_TRUE(base::WriteFile(key_file_, ""));
   EXPECT_TRUE(util_->IsPublicKeyPresent());
   EXPECT_FALSE(util_->ImportPublicKey());
 }
diff --git a/components/policy/core/common/cloud/user_cloud_policy_store.cc b/components/policy/core/common/cloud/user_cloud_policy_store.cc
index 07db20b..af3fac0 100644
--- a/components/policy/core/common/cloud/user_cloud_policy_store.cc
+++ b/components/policy/core/common/cloud/user_cloud_policy_store.cc
@@ -48,8 +48,7 @@
     return false;
   }
 
-  int size = data.size();
-  if (base::WriteFile(path, data.c_str(), size) != size) {
+  if (!base::WriteFile(path, data)) {
     DLOG(WARNING) << "Failed to write " << path.value();
     return false;
   }
diff --git a/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc b/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
index b43077f..13e9f0e7 100644
--- a/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
+++ b/components/policy/core/common/cloud/user_cloud_policy_store_unittest.cc
@@ -42,8 +42,7 @@
     return false;
   }
 
-  int size = data.size();
-  if (base::WriteFile(path, data.c_str(), size) != size) {
+  if (!base::WriteFile(path, data)) {
     DLOG(WARNING) << "Failed to write " << path.value();
     return false;
   }
@@ -165,9 +164,7 @@
   // Create a bogus file.
   ASSERT_TRUE(base::CreateDirectory(policy_file().DirName()));
   std::string bogus_data = "bogus_data";
-  int size = bogus_data.size();
-  ASSERT_EQ(size, base::WriteFile(policy_file(),
-                                  bogus_data.c_str(), bogus_data.size()));
+  ASSERT_TRUE(base::WriteFile(policy_file(), bogus_data));
 
   ExpectError(store_.get(), CloudPolicyStore::STATUS_LOAD_ERROR);
   store_->Load();
@@ -197,9 +194,7 @@
   // Create a bogus file.
   ASSERT_TRUE(base::CreateDirectory(policy_file().DirName()));
   std::string bogus_data = "bogus_data";
-  int size = bogus_data.size();
-  ASSERT_EQ(size, base::WriteFile(policy_file(),
-                                  bogus_data.c_str(), bogus_data.size()));
+  ASSERT_TRUE(base::WriteFile(policy_file(), bogus_data));
 
   ExpectError(store_.get(), CloudPolicyStore::STATUS_LOAD_ERROR);
   store_->LoadImmediately();  // Should load without running the message loop.
@@ -221,8 +216,7 @@
   std::string data;
   ASSERT_TRUE(unsigned_builder.policy().SerializeToString(&data));
   ASSERT_TRUE(base::CreateDirectory(policy_file().DirName()));
-  int size = data.size();
-  ASSERT_EQ(size, base::WriteFile(policy_file(), data.c_str(), size));
+  ASSERT_TRUE(base::WriteFile(policy_file(), data));
 
   // Now make sure the data generates a validation error.
   ExpectError(store_.get(), CloudPolicyStore::STATUS_VALIDATION_ERROR);
diff --git a/components/policy/core/common/config_dir_policy_loader_unittest.cc b/components/policy/core/common/config_dir_policy_loader_unittest.cc
index bf03129..2c5c4b0 100644
--- a/components/policy/core/common/config_dir_policy_loader_unittest.cc
+++ b/components/policy/core/common/config_dir_policy_loader_unittest.cc
@@ -162,8 +162,7 @@
   const base::FilePath mandatory_dir(test_dir().Append(kMandatoryPath));
   ASSERT_TRUE(base::CreateDirectory(mandatory_dir));
   const base::FilePath file_path(mandatory_dir.AppendASCII(file_name));
-  ASSERT_EQ((int)data.size(),
-            base::WriteFile(file_path, data.c_str(), data.size()));
+  ASSERT_TRUE(base::WriteFile(file_path, data));
 }
 
 std::string TestHarness::NextConfigFileName() {
diff --git a/components/quirks/quirks_client.cc b/components/quirks/quirks_client.cc
index 9aed62c..9f9d04b 100644
--- a/components/quirks/quirks_client.cc
+++ b/components/quirks/quirks_client.cc
@@ -40,13 +40,13 @@
 };
 
 bool WriteIccFile(const base::FilePath file_path, const std::string& data) {
-  int bytes_written = base::WriteFile(file_path, data.data(), data.length());
-  if (bytes_written == -1)
+  if (!base::WriteFile(file_path, data)) {
     PLOG(ERROR) << "Write failed: " << file_path.value();
-  else
-    VLOG(1) << bytes_written << "bytes written to: " << file_path.value();
+    return false;
+  }
 
-  return (bytes_written != -1);
+  VLOG(1) << data.size() << "bytes written to: " << file_path.value();
+  return true;
 }
 
 }  // namespace
diff --git a/components/reporting/client/report_queue_impl.cc b/components/reporting/client/report_queue_impl.cc
index 1292e11..5064095 100644
--- a/components/reporting/client/report_queue_impl.cc
+++ b/components/reporting/client/report_queue_impl.cc
@@ -63,6 +63,20 @@
     record.set_reserved_space(reserved_space);
   }
 
+  // Additional record augmentation for keeping local record copy.
+  // Note: that must be done before calling `storage->AddRecord` below,
+  // because later the handler might call it with no need to set this flag.
+  switch (destination) {
+    case LOG_UPLOAD:
+      // It would be better to base the decision on `upload_settings` presence
+      // in the event, but that would require protobuf reflecion, that is not
+      // included in Chromium build. So instead we just use `destination`.
+      record.set_needs_local_unencrypted_copy(true);
+      break;
+    default:  // Do nothing.
+      break;
+  }
+
   // |record| with no DM token is assumed to be associated with device DM token
   if (!dm_token.empty()) {
     *record.mutable_dm_token() = std::move(dm_token);
diff --git a/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc b/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc
index da756f3..4c43d66 100644
--- a/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc
+++ b/components/safe_browsing/core/browser/db/v4_local_database_manager_unittest.cc
@@ -1576,7 +1576,7 @@
   ASSERT_FALSE(base::PathExists(old_store_path));
 
   // Now write an empty file at |old_store_path|.
-  base::WriteFile(old_store_path, "", 0);
+  base::WriteFile(old_store_path, "");
   ASSERT_TRUE(base::PathExists(old_store_path));
 
   WaitForTasksOnTaskRunner();
@@ -1637,7 +1637,7 @@
     ASSERT_FALSE(base::PathExists(new_store_path));
 
     // Now write an empty file at |old_store_path|.
-    base::WriteFile(old_store_path, "", 0);
+    base::WriteFile(old_store_path, "");
     ASSERT_TRUE(base::PathExists(old_store_path));
   }
 
@@ -1734,7 +1734,7 @@
   ASSERT_FALSE(base::PathExists(old_store_path));
 
   // Now write an empty old file.
-  base::WriteFile(old_store_path, "", 0);
+  base::WriteFile(old_store_path, "");
   ASSERT_TRUE(base::PathExists(old_store_path));
 
   auto new_store_path =
@@ -1742,7 +1742,7 @@
   ASSERT_FALSE(base::PathExists(new_store_path));
 
   // Now write an empty new file.
-  base::WriteFile(new_store_path, "", 0);
+  base::WriteFile(new_store_path, "");
   ASSERT_TRUE(base::PathExists(new_store_path));
 
   WaitForTasksOnTaskRunner();
diff --git a/components/safe_browsing/core/browser/db/v4_store_unittest.cc b/components/safe_browsing/core/browser/db/v4_store_unittest.cc
index 56e9ce6..bdf3b762 100644
--- a/components/safe_browsing/core/browser/db/v4_store_unittest.cc
+++ b/components/safe_browsing/core/browser/db/v4_store_unittest.cc
@@ -73,8 +73,7 @@
 
     std::string file_format_string;
     file_format->SerializeToString(&file_format_string);
-    base::WriteFile(store_path_, file_format_string.data(),
-                    file_format_string.size());
+    base::WriteFile(store_path_, file_format_string);
   }
 
   void UpdatedStoreReady(bool* called_back,
@@ -122,7 +121,7 @@
 
 TEST_F(V4StoreTest, TestReadFromInvalidContentsFile) {
   const char kInvalidContents[] = "Chromium";
-  base::WriteFile(store_path_, kInvalidContents, strlen(kInvalidContents));
+  base::WriteFile(store_path_, kInvalidContents);
   EXPECT_EQ(PROTO_PARSING_FAILURE,
             InMemoryV4Store(task_runner_, store_path_).ReadFromDisk());
 }
@@ -132,7 +131,7 @@
   checksum.set_sha256("checksum");
   std::string checksum_string;
   checksum.SerializeToString(&checksum_string);
-  base::WriteFile(store_path_, checksum_string.data(), checksum_string.size());
+  base::WriteFile(store_path_, checksum_string);
 
   // Even though we wrote a completely different proto to file, the proto
   // parsing method does not fail. This shows the importance of a magic number.
diff --git a/components/safe_browsing/core/common/features.cc b/components/safe_browsing/core/common/features.cc
index f54aab4..d7c8725 100644
--- a/components/safe_browsing/core/common/features.cc
+++ b/components/safe_browsing/core/common/features.cc
@@ -106,6 +106,10 @@
     &kExtensionTelemetry, "NumberOfWritesInInterval",
     /*default_value=*/1};
 
+BASE_FEATURE(kExtensionTelemetryConfiguration,
+             "SafeBrowsingExtensionTelemetryConfiguration",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kExtensionTelemetryCookiesGetAllSignal,
              "SafeBrowsingExtensionTelemetryCookiesGetAllSignal",
              base::FEATURE_DISABLED_BY_DEFAULT);
@@ -114,10 +118,6 @@
              "SafeBrowsingExtensionTelemetryPersistence",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-BASE_FEATURE(kExtensionTelemetryConfiguration,
-             "SafeBrowsingExtensionTelemetryConfiguration",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 BASE_FEATURE(kExtensionTelemetryFileData,
              "SafeBrowsingExtensionTelemetryFileData",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/search_provider_logos/logo_cache.cc b/components/search_provider_logos/logo_cache.cc
index 6506a0b..00635ec 100644
--- a/components/search_provider_logos/logo_cache.cc
+++ b/components/search_provider_logos/logo_cache.cc
@@ -404,7 +404,7 @@
 
   std::string str;
   LogoMetadataToString(*metadata_, logo_num_bytes_, dark_logo_num_bytes_, &str);
-  base::WriteFile(GetMetadataPath(), str.data(), static_cast<int>(str.size()));
+  base::WriteFile(GetMetadataPath(), str);
 }
 
 void LogoCache::WriteLogo(
@@ -428,15 +428,12 @@
   if (!base::DeleteFile(metadata_path))
     return;
 
-  if (encoded_image &&
-      base::WriteFile(logo_path, encoded_image->front_as<char>(),
-                      static_cast<int>(encoded_image->size())) == -1) {
+  if (encoded_image && !base::WriteFile(logo_path, *encoded_image)) {
     base::DeleteFile(logo_path);
     return;
   }
   if (dark_encoded_image &&
-      base::WriteFile(dark_logo_path, dark_encoded_image->front_as<char>(),
-                      static_cast<int>(dark_encoded_image->size())) == -1) {
+      !base::WriteFile(dark_logo_path, *dark_encoded_image)) {
     base::DeleteFile(logo_path);
     base::DeleteFile(dark_logo_path);
     return;
diff --git a/components/services/screen_ai/public/cpp/screen_ai_install_state.cc b/components/services/screen_ai/public/cpp/screen_ai_install_state.cc
index 277d43d3..fb978bf 100644
--- a/components/services/screen_ai/public/cpp/screen_ai_install_state.cc
+++ b/components/services/screen_ai/public/cpp/screen_ai_install_state.cc
@@ -17,11 +17,30 @@
 #include "components/services/screen_ai/public/cpp/utilities.h"
 #include "ui/accessibility/accessibility_features.h"
 
+#if BUILDFLAG(IS_LINUX)
+#include "base/cpu.h"
+#endif
+
 namespace {
 const int kScreenAICleanUpDelayInDays = 30;
 const char kMinExpectedVersion[] = "112.1";
 }
 
+namespace {
+
+bool IsDeviceCompatible() {
+  // Check if the CPU has the required instruction set to run the Screen AI
+  // library.
+#if BUILDFLAG(IS_LINUX)
+  if (!base::CPU().has_sse41()) {
+    return false;
+  }
+#endif
+  return true;
+}
+
+}  // namespace
+
 namespace screen_ai {
 
 // static
@@ -45,8 +64,9 @@
 
 // static
 bool ScreenAIInstallState::ShouldInstall(PrefService* local_state) {
-  if (!features::IsScreenAIServiceNeeded())
+  if (!features::IsScreenAIServiceNeeded() || !IsDeviceCompatible()) {
     return false;
+  }
 
   // Remove scheduled time for deletion as feature is needed.
   local_state->SetTime(prefs::kScreenAIScheduledDeletionTimePrefName,
diff --git a/components/services/storage/public/cpp/quota_error_or.h b/components/services/storage/public/cpp/quota_error_or.h
index 106487d..bc9bbf17 100644
--- a/components/services/storage/public/cpp/quota_error_or.h
+++ b/components/services/storage/public/cpp/quota_error_or.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_QUOTA_ERROR_OR_H_
 #define COMPONENTS_SERVICES_STORAGE_PUBLIC_CPP_QUOTA_ERROR_OR_H_
 
-#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "base/types/expected.h"
 
 namespace storage {
 
@@ -22,36 +22,8 @@
 
 // Helper for methods which perform database operations which may fail. Objects
 // of this type can on either a QuotaError or a result value of arbitrary type.
-template <typename ValueType>
-class QuotaErrorOr {
- public:
-  QuotaErrorOr() = default;
-  QuotaErrorOr(QuotaError error) : error_(error) {}              // NOLINT
-  QuotaErrorOr(const ValueType& value) : maybe_value_(value) {}  // NOLINT
-  QuotaErrorOr(ValueType&& value)                                // NOLINT
-      : maybe_value_(absl::in_place, std::move(value)) {}
-  QuotaErrorOr(const QuotaErrorOr&) = delete;
-  QuotaErrorOr(QuotaErrorOr&&) noexcept = default;
-  QuotaErrorOr& operator=(const QuotaErrorOr&) = delete;
-  QuotaErrorOr& operator=(QuotaErrorOr&&) noexcept = default;
-  ~QuotaErrorOr() = default;
-
-  bool ok() const { return maybe_value_.has_value(); }
-  QuotaError error() const {
-    DCHECK(!ok());
-    return error_;
-  }
-
-  ValueType& value() { return maybe_value_.value(); }
-  const ValueType& value() const { return maybe_value_.value(); }
-
-  ValueType* operator->() { return &maybe_value_.value(); }
-  const ValueType* operator->() const { return &maybe_value_.value(); }
-
- private:
-  QuotaError error_ = QuotaError::kNone;
-  absl::optional<ValueType> maybe_value_;
-};
+template <class ValueType>
+using QuotaErrorOr = base::expected<ValueType, QuotaError>;
 
 }  // namespace storage
 
diff --git a/components/stability_report/BUILD.gn b/components/stability_report/BUILD.gn
new file mode 100644
index 0000000..8e57a721
--- /dev/null
+++ b/components/stability_report/BUILD.gn
@@ -0,0 +1,40 @@
+# 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")
+
+if (is_win) {
+  proto_library("stability_report_proto") {
+    sources = [ "stability_report.proto" ]
+  }
+
+  # This target links into the crashpad handler which lives in chrome_elf.dll
+  # on Windows.
+  static_library("stability_report") {
+    sources = [
+      "user_stream_data_source.cc",
+      "user_stream_data_source.h",
+    ]
+    deps = [
+      ":stability_report_proto",
+      "//base",
+      "//third_party/crashpad/crashpad/handler",
+      "//third_party/crashpad/crashpad/minidump",
+      "//third_party/crashpad/crashpad/snapshot",
+    ]
+  }
+
+  source_set("unit_tests") {
+    testonly = true
+    sources = [ "user_stream_data_source_unittest.cc" ]
+    deps = [
+      ":stability_report",
+      ":stability_report_proto",
+      "//base",
+      "//testing/gtest",
+      "//third_party/crashpad/crashpad/minidump",
+      "//third_party/crashpad/crashpad/snapshot:test_support",
+    ]
+  }
+}
diff --git a/components/stability_report/DEPS b/components/stability_report/DEPS
new file mode 100644
index 0000000..9cc5ee1
--- /dev/null
+++ b/components/stability_report/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+third_party/crashpad/crashpad",
+]
diff --git a/components/stability_report/DIR_METADATA b/components/stability_report/DIR_METADATA
new file mode 100644
index 0000000..030c855
--- /dev/null
+++ b/components/stability_report/DIR_METADATA
@@ -0,0 +1,3 @@
+monorail {
+  component: "Internals>CrashReporting"
+}
diff --git a/components/stability_report/OWNERS b/components/stability_report/OWNERS
new file mode 100644
index 0000000..764be4b
--- /dev/null
+++ b/components/stability_report/OWNERS
@@ -0,0 +1,2 @@
+jessemckenna@google.com
+joenotcharles@google.com
diff --git a/components/stability_report/README.md b/components/stability_report/README.md
new file mode 100644
index 0000000..e1779a4e
--- /dev/null
+++ b/components/stability_report/README.md
@@ -0,0 +1,10 @@
+This component registers a `crashpad::UserStreamDataSource` with the `crash`
+component. Whenever a process crashes, it collects stats on the resources used
+by the crashed process (e.g. memory in use and available, open file handles)
+and writes them to the stream as a serialized `StabilityReport` proto.
+
+This is currently only implemented on Windows.
+
+Google-internal details: The `StabilityReport` is parsed by the crash server
+and displayed in the Breadcrumbs tab of the crash UI. The parsing code is at
+http://shortn/_Xt58wqlKTk.
\ No newline at end of file
diff --git a/components/stability_report/stability_report.proto b/components/stability_report/stability_report.proto
new file mode 100644
index 0000000..8c97c95b
--- /dev/null
+++ b/components/stability_report/stability_report.proto
@@ -0,0 +1,74 @@
+// 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.
+
+// This proto is parsed by the crash server using code at
+// http://shortn/_Xt58wqlKTk (Google-internal link). All changes must be
+// reflected in the server-side copy there.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package stability_report;
+
+// The state of a process.
+// Next id: 7
+message ProcessState {
+  // Fields that were removed in https://crrev.com/c/4265975.
+  reserved 1, 2, 5, 6;
+
+  // The identifier of the process.
+  optional int64 process_id = 3;
+
+  // Records the state of process memory at the time of crash.
+  // Next id: 6
+  message MemoryState {
+    message WindowsMemory {
+      // The private byte usage of the process. Unit is 4K pages.
+      optional uint32 process_private_usage = 1;
+      // The peak working set usage of the process. Unit is 4K pages.
+      optional uint32 process_peak_workingset_size = 2;
+      // The peak pagefile usage of the process. Unit is 4K pages.
+      optional uint32 process_peak_pagefile_usage = 3;
+      // The allocation request that caused OOM, bytes.
+      optional uint32 process_allocation_attempt = 4;
+      // The number of opened handles in the process.
+      optional uint32 process_handle_count = 5;
+    }
+
+    optional WindowsMemory windows_memory = 1;
+  }
+
+  optional MemoryState memory_state = 4;
+}
+
+// Records the state of system memory at the time of crash.
+// Next id: 2
+message SystemMemoryState {
+  message WindowsMemory {
+    // The system commit limit. Unit is number of 4K pages.
+    optional uint32 system_commit_limit = 1;
+    // The amount of system commit remaining. Unit is number of 4K pages.
+    optional uint32 system_commit_remaining = 2;
+    // The current number of open handles.
+    optional uint32 system_handle_count = 3;
+  }
+
+  optional WindowsMemory windows_memory = 1;
+}
+
+// A stability report contains information pertaining to the execution of a
+// single logical instance of a "chrome browser". It is comprised of information
+// about the system state and about the chrome browser's processes.
+// Next id: 9
+message StabilityReport {
+  // Fields that were removed in https://crrev.com/c/4265975.
+  reserved 1, 3 to 6, 8;
+
+  // State pertaining to Chrome's processes.
+  repeated ProcessState process_states = 2;
+
+  // System-wide resource usage.
+  optional SystemMemoryState system_memory_state = 7;
+}
diff --git a/components/stability_report/user_stream_data_source.cc b/components/stability_report/user_stream_data_source.cc
new file mode 100644
index 0000000..e0110ca95
--- /dev/null
+++ b/components/stability_report/user_stream_data_source.cc
@@ -0,0 +1,161 @@
+// 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 "components/stability_report/user_stream_data_source.h"
+
+#include <windows.h>
+
+// Must be included after windows.h.
+#include <psapi.h>
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/check.h"
+#include "base/dcheck_is_on.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/process/memory.h"
+#include "base/process/process.h"
+#include "components/stability_report/stability_report.pb.h"
+#include "third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.h"
+#include "third_party/crashpad/crashpad/snapshot/exception_snapshot.h"
+#include "third_party/crashpad/crashpad/snapshot/process_snapshot.h"
+
+namespace stability_report {
+
+namespace {
+
+// The stream type assigned to the minidump stream that holds the serialized
+// stability report.
+// Note: the value was obtained by adding 1 to the stream type used for holding
+// the SyzyAsan proto.
+constexpr uint32_t kStreamType = 0x4B6B0002;
+
+// System memory metrics are reported in pages. Use this page size to scale
+// process memory metrics to the same units.
+constexpr size_t kPageSize = 4096;
+
+// A data source that holds a serialized StabilityReport.
+class StabilityReportDataSource final
+    : public crashpad::MinidumpUserExtensionStreamDataSource {
+ public:
+  explicit StabilityReportDataSource(const StabilityReport& report);
+  ~StabilityReportDataSource() final = default;
+
+  StabilityReportDataSource(const StabilityReportDataSource&) = delete;
+  StabilityReportDataSource& operator=(const StabilityReportDataSource&) =
+      delete;
+
+  size_t StreamDataSize() final { return data_.size(); }
+
+  bool ReadStreamData(Delegate* delegate) final;
+
+ private:
+  std::string data_;
+};
+
+StabilityReportDataSource::StabilityReportDataSource(
+    const StabilityReport& report)
+    : crashpad::MinidumpUserExtensionStreamDataSource(kStreamType),
+      data_(report.SerializeAsString()) {
+  // On error, SerializeAsString() will return an empty string which will
+  // cause ReadStreamData() to harmlessly return no data.
+}
+
+bool StabilityReportDataSource::ReadStreamData(Delegate* delegate) {
+  return delegate->ExtensionStreamDataSourceRead(data_.data(), data_.size());
+}
+
+// Adds system metrics to `report`.
+void CollectSystemPerformanceMetrics(StabilityReport* report) {
+  // Grab system commit memory. Best effort.
+  PERFORMANCE_INFORMATION perf_info = {sizeof(perf_info)};
+  if (!::GetPerformanceInfo(&perf_info, sizeof(perf_info))) {
+    return;
+  }
+  SystemMemoryState::WindowsMemory* memory_state =
+      report->mutable_system_memory_state()->mutable_windows_memory();
+  memory_state->set_system_commit_limit(perf_info.CommitLimit);
+  memory_state->set_system_commit_remaining(perf_info.CommitLimit -
+                                            perf_info.CommitTotal);
+  memory_state->set_system_handle_count(perf_info.HandleCount);
+  // The process memory metrics won't be scaled correctly with an unexpected
+  // page size.
+  DCHECK_EQ(perf_info.PageSize, kPageSize);
+}
+
+// Adds metrics for the process in `process_snapshot` to `report`.
+void CollectProcessPerformanceMetrics(
+    const crashpad::ProcessSnapshot& process_snapshot,
+    StabilityReport* report) {
+  const base::ProcessId process_id = process_snapshot.ProcessID();
+
+#if DCHECK_IS_ON()
+  // Ensure no ProcessState was created yet for the process in question.
+  for (const ProcessState& process_state : report->process_states()) {
+    DCHECK_NE(process_state.process_id(), process_id);
+  }
+#endif
+
+  ProcessState* process_state = report->add_process_states();
+  process_state->set_process_id(process_id);
+
+  ProcessState::MemoryState::WindowsMemory* memory_state =
+      process_state->mutable_memory_state()->mutable_windows_memory();
+
+  // Grab the requested allocation size in case of OOM exception.
+  const crashpad::ExceptionSnapshot* const exception =
+      process_snapshot.Exception();
+  if (exception && exception->Exception() == base::win::kOomExceptionCode &&
+      !exception->Codes().empty()) {
+    // The first parameter, if present, is the size of the allocation attempt.
+    // Note Codes() contains 64-bit values but `process_allocation_attempt` is
+    // a uint32.
+    memory_state->set_process_allocation_attempt(
+        base::saturated_cast<uint32_t>(exception->Codes().front()));
+  }
+
+  const base::Process process = base::Process::OpenWithAccess(
+      process_id, PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ);
+  if (!process.IsValid()) {
+    return;
+  }
+
+  PROCESS_MEMORY_COUNTERS_EX process_memory = {sizeof(process_memory)};
+  if (::GetProcessMemoryInfo(
+          process.Handle(),
+          reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&process_memory),
+          sizeof(process_memory))) {
+    // This is in units of bytes, re-scale to pages for consistency with system
+    // metrics.
+    memory_state->set_process_private_usage(process_memory.PrivateUsage /
+                                            kPageSize);
+    memory_state->set_process_peak_workingset_size(
+        process_memory.PeakWorkingSetSize / kPageSize);
+    memory_state->set_process_peak_pagefile_usage(
+        process_memory.PeakPagefileUsage / kPageSize);
+  }
+
+  DWORD process_handle_count = 0;
+  if (::GetProcessHandleCount(process.Handle(), &process_handle_count)) {
+    memory_state->set_process_handle_count(process_handle_count);
+  }
+}
+
+}  // namespace
+
+std::unique_ptr<crashpad::MinidumpUserExtensionStreamDataSource>
+UserStreamDataSource::ProduceStreamData(
+    crashpad::ProcessSnapshot* process_snapshot) {
+  DCHECK(process_snapshot);
+
+  StabilityReport report;
+  CollectSystemPerformanceMetrics(&report);
+  CollectProcessPerformanceMetrics(*process_snapshot, &report);
+
+  return std::make_unique<StabilityReportDataSource>(report);
+}
+
+}  // namespace stability_report
diff --git a/components/stability_report/user_stream_data_source.h b/components/stability_report/user_stream_data_source.h
new file mode 100644
index 0000000..2b22747
--- /dev/null
+++ b/components/stability_report/user_stream_data_source.h
@@ -0,0 +1,36 @@
+// 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 COMPONENTS_STABILITY_REPORT_USER_STREAM_DATA_SOURCE_H_
+#define COMPONENTS_STABILITY_REPORT_USER_STREAM_DATA_SOURCE_H_
+
+#include <memory>
+
+#include "third_party/crashpad/crashpad/handler/user_stream_data_source.h"
+
+namespace crashpad {
+class MinidumpUserExtensionStreamDataSource;
+class ProcessSnapshot;
+}  // namespace crashpad
+
+namespace stability_report {
+
+// Collects stability instrumentation corresponding to a ProcessSnapshot and
+// makes it available to the crash handler as a serialized StabilityReport
+// proto.
+class UserStreamDataSource final : public crashpad::UserStreamDataSource {
+ public:
+  UserStreamDataSource() = default;
+  ~UserStreamDataSource() final = default;
+
+  UserStreamDataSource(const UserStreamDataSource&) = delete;
+  UserStreamDataSource& operator=(const UserStreamDataSource&) = delete;
+
+  std::unique_ptr<crashpad::MinidumpUserExtensionStreamDataSource>
+  ProduceStreamData(crashpad::ProcessSnapshot* process_snapshot) final;
+};
+
+}  // namespace stability_report
+
+#endif  // COMPONENTS_STABILITY_REPORT_USER_STREAM_DATA_SOURCE_H_
diff --git a/components/stability_report/user_stream_data_source_unittest.cc b/components/stability_report/user_stream_data_source_unittest.cc
new file mode 100644
index 0000000..dd40a7c
--- /dev/null
+++ b/components/stability_report/user_stream_data_source_unittest.cc
@@ -0,0 +1,160 @@
+// 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 "components/stability_report/user_stream_data_source.h"
+
+#include <memory>
+#include <tuple>
+#include <utility>
+
+#include "base/process/memory.h"
+#include "base/process/process.h"
+#include "components/stability_report/stability_report.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/crashpad/crashpad/minidump/minidump_user_extension_stream_data_source.h"
+#include "third_party/crashpad/crashpad/snapshot/test/test_exception_snapshot.h"
+#include "third_party/crashpad/crashpad/snapshot/test/test_process_snapshot.h"
+
+namespace stability_report {
+
+namespace {
+
+class StabilityReportReader final
+    : public crashpad::MinidumpUserExtensionStreamDataSource::Delegate {
+ public:
+  StabilityReportReader() = default;
+  ~StabilityReportReader() = default;
+
+  StabilityReportReader(const StabilityReportReader&) = delete;
+  StabilityReportReader& operator=(const StabilityReportReader&) = delete;
+
+  const StabilityReport& report() const { return report_; }
+
+  bool ExtensionStreamDataSourceRead(const void* data, size_t size) final {
+    return report_.ParseFromArray(data, size);
+  }
+
+ private:
+  StabilityReport report_;
+};
+
+constexpr uint64_t kExpectedAllocationAttempt = 12345;
+
+using ::testing::Bool;
+using ::testing::Combine;
+using ::testing::TestWithParam;
+using ::testing::Values;
+
+enum class ExceptionCode {
+  // No ExceptionSnapshot.
+  kNone,
+  // ExceptionSnapshot has a non-OOM code.
+  kNotOOM,
+  // ExceptionSnapshot with kOomExceptionCode and allocation info in Codes().
+  kOOMWithAllocation,
+  // ExceptionSnapshot with kOomExceptionCode but no allocation info in Codes().
+  kOOMWithoutAllocation,
+};
+
+class StabilityReportUserStreamDataSourceTest
+    : public TestWithParam<std::tuple<bool, ExceptionCode>> {
+ protected:
+  StabilityReportUserStreamDataSourceTest() {
+    std::tie(is_valid_process_, exception_code_) = GetParam();
+  }
+
+  bool is_valid_process_;
+  ExceptionCode exception_code_;
+};
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         StabilityReportUserStreamDataSourceTest,
+                         Combine(Bool(),
+                                 Values(ExceptionCode::kNone,
+                                        ExceptionCode::kNotOOM,
+                                        ExceptionCode::kOOMWithAllocation,
+                                        ExceptionCode::kOOMWithoutAllocation)));
+
+TEST_P(StabilityReportUserStreamDataSourceTest, ReadProcess) {
+  crashpad::test::TestProcessSnapshot process_snapshot;
+  process_snapshot.SetProcessID(is_valid_process_
+                                    ? base::Process::Current().Pid()
+                                    : base::kNullProcessId);
+  if (exception_code_ != ExceptionCode::kNone) {
+    auto exception_snapshot =
+        std::make_unique<crashpad::test::TestExceptionSnapshot>();
+    switch (exception_code_) {
+      case ExceptionCode::kNotOOM:
+        // Set an arbitrary error code.
+        exception_snapshot->SetException(ERROR_INVALID_HANDLE);
+        exception_snapshot->SetCodes({kExpectedAllocationAttempt});
+        break;
+      case ExceptionCode::kOOMWithAllocation:
+        exception_snapshot->SetException(base::win::kOomExceptionCode);
+        exception_snapshot->SetCodes({kExpectedAllocationAttempt});
+        break;
+      case ExceptionCode::kOOMWithoutAllocation:
+        exception_snapshot->SetException(base::win::kOomExceptionCode);
+        exception_snapshot->SetCodes({});
+        break;
+      case ExceptionCode::kNone:
+        // Should not be reached.
+        FAIL();
+    }
+    process_snapshot.SetException(std::move(exception_snapshot));
+  }
+
+  // Collect a StabilityReport from `process_snapshot`.
+  UserStreamDataSource source;
+  std::unique_ptr<crashpad::MinidumpUserExtensionStreamDataSource> data_source =
+      source.ProduceStreamData(&process_snapshot);
+  ASSERT_TRUE(data_source);
+
+  // Read the StabilityReport back out of the stream data.
+  StabilityReportReader reader;
+  ASSERT_TRUE(data_source->ReadStreamData(&reader));
+
+  // Validate ProcessState.
+  ASSERT_EQ(reader.report().process_states_size(), 1);
+  const ProcessState& process_state = reader.report().process_states(0);
+  EXPECT_EQ(process_state.process_id(), process_snapshot.ProcessID());
+  ASSERT_TRUE(process_state.has_memory_state());
+  ASSERT_TRUE(process_state.memory_state().has_windows_memory());
+  const ProcessState::MemoryState::WindowsMemory& process_memory =
+      process_state.memory_state().windows_memory();
+
+  // Memory stats are only filled in if the process could be queried.
+  if (is_valid_process_) {
+    EXPECT_GT(process_memory.process_private_usage(), 0U);
+    EXPECT_GT(process_memory.process_peak_workingset_size(), 0U);
+    EXPECT_GT(process_memory.process_peak_pagefile_usage(), 0U);
+    EXPECT_GT(process_memory.process_handle_count(), 0U);
+  } else {
+    EXPECT_FALSE(process_memory.has_process_private_usage());
+    EXPECT_FALSE(process_memory.has_process_peak_workingset_size());
+    EXPECT_FALSE(process_memory.has_process_peak_pagefile_usage());
+    EXPECT_FALSE(process_memory.has_process_handle_count());
+  }
+
+  // Allocation attempt is only set on OOM when all info is available.
+  if (exception_code_ == ExceptionCode::kOOMWithAllocation) {
+    EXPECT_EQ(process_memory.process_allocation_attempt(),
+              kExpectedAllocationAttempt);
+  } else {
+    EXPECT_FALSE(process_memory.has_process_allocation_attempt());
+  }
+
+  // Validate SystemMemoryState.
+  ASSERT_TRUE(reader.report().has_system_memory_state());
+  ASSERT_TRUE(reader.report().system_memory_state().has_windows_memory());
+  const SystemMemoryState::WindowsMemory& system_memory =
+      reader.report().system_memory_state().windows_memory();
+  EXPECT_GT(system_memory.system_commit_limit(), 0U);
+  EXPECT_GT(system_memory.system_commit_remaining(), 0U);
+  EXPECT_GT(system_memory.system_handle_count(), 0U);
+}
+
+}  // namespace
+
+}  // namespace stability_report
diff --git a/components/translate/content/renderer/per_frame_translate_agent.cc b/components/translate/content/renderer/per_frame_translate_agent.cc
index 3e6163b..8a84116c 100644
--- a/components/translate/content/renderer/per_frame_translate_agent.cc
+++ b/components/translate/content/renderer/per_frame_translate_agent.cc
@@ -220,7 +220,10 @@
   v8::Local<v8::Value> result =
       local_frame->ExecuteScriptInIsolatedWorldAndReturnValue(
           world_id_, source, blink::BackForwardCacheAware::kAllow);
-  DCHECK(result->IsBoolean());
+
+  if (result.IsEmpty() || !result->IsBoolean()) {
+    return fallback;
+  }
 
   return result.As<v8::Boolean>()->Value();
 }
@@ -238,7 +241,10 @@
   v8::Local<v8::Value> result =
       local_frame->ExecuteScriptInIsolatedWorldAndReturnValue(
           world_id_, source, blink::BackForwardCacheAware::kAllow);
-  DCHECK(result->IsString());
+
+  if (result.IsEmpty() || !result->IsString()) {
+    return std::string();
+  }
 
   v8::Local<v8::String> v8_str = result.As<v8::String>();
   int length = v8_str->Utf8Length(isolate);
@@ -263,7 +269,10 @@
   v8::Local<v8::Value> result =
       local_frame->ExecuteScriptInIsolatedWorldAndReturnValue(
           world_id_, source, blink::BackForwardCacheAware::kAllow);
-  DCHECK(result->IsNumber());
+
+  if (result.IsEmpty() || !result->IsNumber()) {
+    return 0.0;
+  }
 
   return result.As<v8::Number>()->Value();
 }
@@ -281,7 +290,10 @@
   v8::Local<v8::Value> result =
       local_frame->ExecuteScriptInIsolatedWorldAndReturnValue(
           world_id_, source, blink::BackForwardCacheAware::kAllow);
-  DCHECK(result->IsNumber());
+
+  if (result.IsEmpty() || !result->IsNumber()) {
+    return 0;
+  }
 
   return result.As<v8::Integer>()->Value();
 }
diff --git a/components/update_client/component.cc b/components/update_client/component.cc
index 446afb4..21359faa 100644
--- a/components/update_client/component.cc
+++ b/components/update_client/component.cc
@@ -118,10 +118,9 @@
   base::ScopedTempDir unpack_path_owner;
   std::ignore = unpack_path_owner.Set(unpack_path);
 
-  if (static_cast<int>(fingerprint.size()) !=
-      base::WriteFile(
+  if (!base::WriteFile(
           unpack_path.Append(FILE_PATH_LITERAL("manifest.fingerprint")),
-          fingerprint.c_str(), base::checked_cast<int>(fingerprint.size()))) {
+          fingerprint)) {
     const CrxInstaller::Result result(InstallError::FINGERPRINT_WRITE_FAILED);
     main_task_runner->PostTask(
         FROM_HERE,
diff --git a/components/update_client/crx_cache_unittest.cc b/components/update_client/crx_cache_unittest.cc
index 94df5a2..9b009f7f 100644
--- a/components/update_client/crx_cache_unittest.cc
+++ b/components/update_client/crx_cache_unittest.cc
@@ -189,9 +189,7 @@
               result.crx_cache_path));
           EXPECT_TRUE(base::DeleteFile(result.crx_cache_path));
           std::string corrupted_data("c0rrupt3d d4t4");
-          EXPECT_TRUE(base::WriteFile(result.crx_cache_path,
-                                      corrupted_data.c_str(),
-                                      corrupted_data.size()));
+          EXPECT_TRUE(base::WriteFile(result.crx_cache_path, corrupted_data));
           EXPECT_FALSE(base::ContentsEqual(
               DuplicateTestFile("jebgalgnebhfojomionfpkfelancnnkf.crx"),
               result.crx_cache_path));
diff --git a/components/url_formatter/spoof_checks/top_domains/make_top_domain_list_variables.cc b/components/url_formatter/spoof_checks/top_domains/make_top_domain_list_variables.cc
index b53b097..7f6cf88c 100644
--- a/components/url_formatter/spoof_checks/top_domains/make_top_domain_list_variables.cc
+++ b/components/url_formatter/spoof_checks/top_domains/make_top_domain_list_variables.cc
@@ -215,8 +215,7 @@
   std::string output = output_stream.str();
 
   base::FilePath output_path = base::FilePath::FromUTF8Unsafe(argv[3]);
-  if (base::WriteFile(output_path, output.c_str(),
-                      static_cast<uint32_t>(output.size())) <= 0) {
+  if (!base::WriteFile(output_path, output)) {
     LOG(ERROR) << "Failed to write output: " << output_path;
     return 1;
   }
diff --git a/components/url_formatter/spoof_checks/top_domains/make_top_domain_skeletons.cc b/components/url_formatter/spoof_checks/top_domains/make_top_domain_skeletons.cc
index c64141a..478014b 100644
--- a/components/url_formatter/spoof_checks/top_domains/make_top_domain_skeletons.cc
+++ b/components/url_formatter/spoof_checks/top_domains/make_top_domain_skeletons.cc
@@ -38,8 +38,7 @@
 
 bool WriteToFile(const std::string& content, base::StringPiece basename) {
   base::FilePath path = GetPath(basename);
-  int size = base::checked_cast<int>(content.size());
-  bool succeeded = base::WriteFile(path, content.data(), size) == size;
+  bool succeeded = base::WriteFile(path, content.data());
   if (!succeeded)
     std::cerr << "Failed to write to " << path.AsUTF8Unsafe() << '\n';
   return succeeded;
diff --git a/components/url_formatter/spoof_checks/top_domains/top_domain_generator.cc b/components/url_formatter/spoof_checks/top_domains/top_domain_generator.cc
index dcfd0e5..f79ada8 100644
--- a/components/url_formatter/spoof_checks/top_domains/top_domain_generator.cc
+++ b/components/url_formatter/spoof_checks/top_domains/top_domain_generator.cc
@@ -184,8 +184,7 @@
   }
 
   base::FilePath output_path = base::FilePath::FromUTF8Unsafe(args[2]);
-  if (base::WriteFile(output_path, output.c_str(),
-                      static_cast<uint32_t>(output.size())) <= 0) {
+  if (!base::WriteFile(output_path, output)) {
     LOG(ERROR) << "Failed to write output: " << output_path;
     return 1;
   }
diff --git a/components/url_formatter/url_fixer_unittest.cc b/components/url_formatter/url_fixer_unittest.cc
index 8643779..efc6a09 100644
--- a/components/url_formatter/url_fixer_unittest.cc
+++ b/components/url_formatter/url_fixer_unittest.cc
@@ -297,7 +297,7 @@
                          const base::FilePath& file_name,
                          base::FilePath* full_path) {
   *full_path = dir.Append(file_name);
-  return base::WriteFile(*full_path, "", 0) == 0;
+  return base::WriteFile(*full_path, "");
 }
 
 // Returns true if the given URL is a file: URL that matches the given file
diff --git a/components/value_store/leveldb_value_store_unittest.cc b/components/value_store/leveldb_value_store_unittest.cc
index f009630..bcc2cbca 100644
--- a/components/value_store/leveldb_value_store_unittest.cc
+++ b/components/value_store/leveldb_value_store_unittest.cc
@@ -175,7 +175,7 @@
   for (base::FilePath file = enumerator.Next(); !file.empty();
        file = enumerator.Next()) {
     // WriteFile() failure is a result of -1.
-    ASSERT_NE(base::WriteFile(file, kLolCats.c_str(), kLolCats.length()), -1);
+    ASSERT_TRUE(base::WriteFile(file, kLolCats));
   }
   CreateStore();
 
diff --git a/components/viz/common/resources/shared_image_format.cc b/components/viz/common/resources/shared_image_format.cc
index 3d9f65b3..a3bba8a9d 100644
--- a/components/viz/common/resources/shared_image_format.cc
+++ b/components/viz/common/resources/shared_image_format.cc
@@ -43,7 +43,7 @@
     case ResourceFormat::ETC1:
       return "ETC1";
     case ResourceFormat::RED_8:
-      return "RED_8";
+      return "R_8";
     case ResourceFormat::RG_88:
       return "RG_88";
     case ResourceFormat::LUMINANCE_F16:
@@ -51,9 +51,9 @@
     case ResourceFormat::RGBA_F16:
       return "RGBA_F16";
     case ResourceFormat::R16_EXT:
-      return "R16_EXT";
+      return "R_16";
     case ResourceFormat::RG16_EXT:
-      return "RG16_EXT";
+      return "RG_1616";
     case ResourceFormat::RGBX_8888:
       return "RGBX_8888";
     case ResourceFormat::BGRX_8888:
diff --git a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
index 6dbb34f..925be5a 100644
--- a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
+++ b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
@@ -56,8 +56,7 @@
         /*discard_transparency=*/false,
         /*comments=*/{}, &output);
 
-    base::WriteFile(NextOutputFilePath(),
-                    reinterpret_cast<char*>(output.data()), output.size());
+    base::WriteFile(NextOutputFilePath(), output);
   }
 
  private:
diff --git a/components/viz/service/frame_sinks/frame_counter.cc b/components/viz/service/frame_sinks/frame_counter.cc
index 4b26b00..3e05f5b6 100644
--- a/components/viz/service/frame_sinks/frame_counter.cc
+++ b/components/viz/service/frame_sinks/frame_counter.cc
@@ -5,6 +5,7 @@
 #include "components/viz/service/frame_sinks/frame_counter.h"
 
 #include <limits>
+#include <string>
 #include <utility>
 #include <vector>
 
@@ -34,7 +35,7 @@
   DCHECK(!base::Contains(frame_sink_data_, frame_sink_id));
 
   auto per_sink_data = mojom::FrameCountingPerSinkData::New(
-      type, is_root, 0, std::vector<uint16_t>());
+      type, is_root, std::string(), 0, std::vector<uint16_t>());
   per_sink_data->presented_frames.reserve(kMaxFrameRecords);
 
   frame_sink_data_[frame_sink_id] = std::move(per_sink_data);
@@ -83,4 +84,9 @@
   frame_sink_data_[frame_sink_id]->type = type;
 }
 
+void FrameCounter::SetFrameSinkDebugLabel(const FrameSinkId& frame_sink_id,
+                                          std::string debug_label) {
+  frame_sink_data_[frame_sink_id]->debug_label = std::move(debug_label);
+}
+
 }  // namespace viz
diff --git a/components/viz/service/frame_sinks/frame_counter.h b/components/viz/service/frame_sinks/frame_counter.h
index 3b6b41e..dbe69ae 100644
--- a/components/viz/service/frame_sinks/frame_counter.h
+++ b/components/viz/service/frame_sinks/frame_counter.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_COUNTER_H_
 #define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_COUNTER_H_
 
+#include <string>
+
 #include "base/containers/flat_map.h"
 #include "base/time/time.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
@@ -37,6 +39,9 @@
   void SetFrameSinkType(const FrameSinkId& frame_sink_id,
                         mojom::CompositorFrameSinkType type);
 
+  void SetFrameSinkDebugLabel(const FrameSinkId& frame_sink_id,
+                              std::string debug_label);
+
  private:
   // Time when the frame counting is stated.
   const base::TimeTicks start_time_;
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index cfbc9d1..5310d9b5 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <string>
 #include <utility>
 
 #include "base/check_op.h"
@@ -178,8 +179,12 @@
     const FrameSinkId& frame_sink_id,
     const std::string& debug_label) {
   auto it = frame_sink_data_.find(frame_sink_id);
-  if (it != frame_sink_data_.end())
+  if (it != frame_sink_data_.end()) {
     it->second.debug_label = debug_label;
+    if (frame_counter_) {
+      frame_counter_->SetFrameSinkDebugLabel(frame_sink_id, debug_label);
+    }
+  }
 }
 
 void FrameSinkManagerImpl::CreateRootCompositorFrameSink(
@@ -839,6 +844,8 @@
     DCHECK_EQ(sink_id, support->frame_sink_id());
     frame_counter_->AddFrameSink(sink_id, support->frame_sink_type(),
                                  support->is_root());
+    frame_counter_->SetFrameSinkDebugLabel(
+        sink_id, static_cast<std::string>(GetFrameSinkDebugLabel(sink_id)));
   }
 }
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 86adcc50..d05a7e6 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -422,7 +422,6 @@
     "attribution_reporting/attribution_cookie_checker.h",
     "attribution_reporting/attribution_cookie_checker_impl.cc",
     "attribution_reporting/attribution_cookie_checker_impl.h",
-    "attribution_reporting/attribution_data_host_manager.cc",
     "attribution_reporting/attribution_data_host_manager.h",
     "attribution_reporting/attribution_data_host_manager_impl.cc",
     "attribution_reporting/attribution_data_host_manager_impl.h",
diff --git a/content/browser/android/content_feature_list.cc b/content/browser/android/content_feature_list.cc
index 68ac249d..b8f0123e 100644
--- a/content/browser/android/content_feature_list.cc
+++ b/content/browser/android/content_feature_list.cc
@@ -29,7 +29,6 @@
     &features::kAutoDisableAccessibilityV2,
     &features::kBackgroundMediaRendererHasModerateBinding,
     &features::kBindingManagerConnectionLimit,
-    &features::kBindingManagerUseNotPerceptibleBinding,
     &features::kComputeAXMode,
     &features::kFedCm,
     &features::kOnDemandAccessibilityEvents,
@@ -46,8 +45,9 @@
 
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
   for (const base::Feature* feature : kFeaturesExposedToJava) {
-    if (feature->name == feature_name)
+    if (feature->name == feature_name) {
       return feature;
+    }
   }
   NOTREACHED() << "Queried feature cannot be found in ContentFeatureList: "
                << feature_name;
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager.cc b/content/browser/attribution_reporting/attribution_data_host_manager.cc
deleted file mode 100644
index 6938db97..0000000
--- a/content/browser/attribution_reporting/attribution_data_host_manager.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// 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 "content/browser/attribution_reporting/attribution_data_host_manager.h"
-
-#include "content/browser/attribution_reporting/attribution_manager.h"
-
-namespace content {
-
-// static
-AttributionDataHostManager* AttributionDataHostManager::FromBrowserContext(
-    BrowserContext* browser_context) {
-  auto* attribution_manager =
-      AttributionManager::FromBrowserContext(browser_context);
-  if (!attribution_manager) {
-    return nullptr;
-  }
-  return attribution_manager->GetDataHostManager();
-}
-
-AttributionDataHostManager::AttributionDataHostManager() = default;
-
-AttributionDataHostManager::~AttributionDataHostManager() = default;
-
-}  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager.h b/content/browser/attribution_reporting/attribution_data_host_manager.h
index 0d85987..8864055 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager.h
+++ b/content/browser/attribution_reporting/attribution_data_host_manager.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "components/attribution_reporting/registration_type.mojom-forward.h"
 #include "content/browser/attribution_reporting/attribution_beacon_id.h"
-#include "content/common/content_export.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
@@ -33,20 +32,15 @@
 
 namespace content {
 
-class BrowserContext;
-
 struct AttributionInputEvent;
 struct GlobalRenderFrameHostId;
 
 // Interface responsible for coordinating `AttributionDataHost`s received from
 // the renderer.
-class CONTENT_EXPORT AttributionDataHostManager
+class AttributionDataHostManager
     : public base::SupportsWeakPtr<AttributionDataHostManager> {
  public:
-  static AttributionDataHostManager* FromBrowserContext(BrowserContext*);
-
-  AttributionDataHostManager();
-  virtual ~AttributionDataHostManager();
+  virtual ~AttributionDataHostManager() = default;
 
   // Registers a new data host with the browser process for the given context
   // origin. This is only called for events which are not associated with a
@@ -115,7 +109,7 @@
       BeaconId beacon_id,
       attribution_reporting::SuitableOrigin source_origin,
       bool is_within_fenced_frame,
-      absl::optional<AttributionInputEvent> input_event,
+      AttributionInputEvent input_event,
       GlobalRenderFrameHostId render_frame_id) = 0;
 
   // Notifies the manager that a beacon has been sent.
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
index b5e21c5..27a88267 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -111,7 +111,7 @@
                   RegistrationType registration_type,
                   base::TimeTicks register_time,
                   bool is_within_fenced_frame,
-                  absl::optional<AttributionInputEvent> input_event,
+                  AttributionInputEvent input_event,
                   absl::optional<AttributionNavigationType> nav_type,
                   GlobalRenderFrameHostId render_frame_id)
       : context_origin_(std::move(context_origin)),
@@ -172,9 +172,9 @@
   bool is_within_fenced_frame_;
 
   // Input event associated with the navigation for navigation source data
-  // hosts, `absl::nullopt` otherwise.
+  // hosts. The underlying Java object will be null for event sources.
   // Logically const.
-  absl::optional<AttributionInputEvent> input_event_;
+  AttributionInputEvent input_event_;
 
   // Logically const.
   absl::optional<AttributionNavigationType> nav_type_;
@@ -267,7 +267,8 @@
   bool is_within_fenced_frame;
 
   // Input event associated with the navigation.
-  absl::optional<AttributionInputEvent> input_event;
+  // The underlying Java object will be null for event beacons.
+  AttributionInputEvent input_event;
 
   GlobalRenderFrameHostId render_frame_id;
 };
@@ -294,7 +295,7 @@
                  ReceiverContext(std::move(context_origin), registration_type,
                                  /*register_time=*/base::TimeTicks::Now(),
                                  is_within_fenced_frame,
-                                 /*input_event=*/absl::nullopt,
+                                 /*input_event=*/AttributionInputEvent(),
                                  /*nav_type=*/absl::nullopt, render_frame_id));
 
   switch (registration_type) {
@@ -714,10 +715,9 @@
     BeaconId beacon_id,
     SuitableOrigin source_origin,
     bool is_within_fenced_frame,
-    absl::optional<AttributionInputEvent> input_event,
+    AttributionInputEvent input_event,
     GlobalRenderFrameHostId render_frame_id) {
   bool is_navigation = absl::holds_alternative<NavigationBeaconId>(beacon_id);
-  DCHECK_EQ(is_navigation, input_event.has_value());
 
   auto [it, inserted] = beacon_registrations_.try_emplace(
       beacon_id, BeaconSourceRegistrations{
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
index 9beeeae..7c40dd1 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
@@ -96,7 +96,7 @@
       BeaconId beacon_id,
       attribution_reporting::SuitableOrigin source_origin,
       bool is_within_fenced_frame,
-      absl::optional<AttributionInputEvent> input_event,
+      AttributionInputEvent input_event,
       GlobalRenderFrameHostId render_frame_id) override;
   void NotifyFencedFrameReportingBeaconSent(BeaconId beacon_id) override;
   void NotifyFencedFrameReportingBeaconData(
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
index fcddb6a..10fabb4 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
@@ -34,6 +34,7 @@
 #include "components/attribution_reporting/suitable_origin.h"
 #include "content/browser/attribution_reporting/attribution_beacon_id.h"
 #include "content/browser/attribution_reporting/attribution_constants.h"
+#include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
 #include "content/browser/attribution_reporting/attribution_trigger.h"
 #include "content/public/browser/global_routing_id.h"
@@ -1863,7 +1864,7 @@
       event_id,
       /*source_origin=*/*SuitableOrigin::Deserialize("https://source.test"),
       /*is_within_fenced_frame=*/true,
-      /*input_event=*/absl::nullopt, kFrameId);
+      /*input_event=*/AttributionInputEvent(), kFrameId);
   data_host_manager_.NotifyFencedFrameReportingBeaconSent(event_id);
 
   auto headers = base::MakeRefCounted<net::HttpResponseHeaders>("");
diff --git a/content/browser/attribution_reporting/attribution_host.cc b/content/browser/attribution_reporting/attribution_host.cc
index c107f38e..183e580 100644
--- a/content/browser/attribution_reporting/attribution_host.cc
+++ b/content/browser/attribution_reporting/attribution_host.cc
@@ -479,7 +479,7 @@
     return;
   }
 
-  absl::optional<AttributionInputEvent> input_event;
+  AttributionInputEvent input_event;
   if (absl::holds_alternative<NavigationBeaconId>(beacon_id)) {
     input_event = AttributionHost::FromWebContents(
                       WebContents::FromRenderFrameHost(initiator_frame_host))
diff --git a/content/browser/attribution_reporting/attribution_host_unittest.cc b/content/browser/attribution_reporting/attribution_host_unittest.cc
index bbfd9b9..b856312 100644
--- a/content/browser/attribution_reporting/attribution_host_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_host_unittest.cc
@@ -126,7 +126,7 @@
               (BeaconId beacon_id,
                SuitableOrigin source_origin,
                bool is_within_fenced_frame,
-               absl::optional<AttributionInputEvent> input_event,
+               AttributionInputEvent input_event,
                GlobalRenderFrameHostId),
               (override));
 
diff --git a/content/browser/attribution_reporting/attribution_manager.cc b/content/browser/attribution_reporting/attribution_manager.cc
index 29e4a5f..305d650 100644
--- a/content/browser/attribution_reporting/attribution_manager.cc
+++ b/content/browser/attribution_reporting/attribution_manager.cc
@@ -5,8 +5,6 @@
 #include "content/browser/attribution_reporting/attribution_manager.h"
 
 #include "base/check.h"
-#include "components/attribution_reporting/os_support.mojom.h"
-#include "content/browser/attribution_reporting/attribution_manager_impl.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
@@ -30,9 +28,4 @@
       ->GetAttributionManager();
 }
 
-// static
-attribution_reporting::mojom::OsSupport AttributionManager::GetOsSupport() {
-  return AttributionManagerImpl::GetOsSupport();
-}
-
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_manager.h b/content/browser/attribution_reporting/attribution_manager.h
index abfcb7d..31989a0 100644
--- a/content/browser/attribution_reporting/attribution_manager.h
+++ b/content/browser/attribution_reporting/attribution_manager.h
@@ -13,6 +13,7 @@
 #include "components/attribution_reporting/source_registration_error.mojom-forward.h"
 #include "components/attribution_reporting/source_type.mojom-forward.h"
 #include "content/browser/attribution_reporting/attribution_report.h"
+#include "content/common/content_export.h"
 #include "content/public/browser/attribution_data_model.h"
 #include "content/public/browser/storage_partition.h"
 
@@ -39,14 +40,12 @@
 
 // Interface that mediates data flow between the network, storage layer, and
 // blink.
-class AttributionManager : public AttributionDataModel {
+class CONTENT_EXPORT AttributionManager : public AttributionDataModel {
  public:
   static AttributionManager* FromWebContents(WebContents* web_contents);
 
   static AttributionManager* FromBrowserContext(BrowserContext*);
 
-  static attribution_reporting::mojom::OsSupport GetOsSupport();
-
   ~AttributionManager() override = default;
 
   virtual void AddObserver(AttributionObserver* observer) = 0;
@@ -111,6 +110,8 @@
                          BrowsingDataFilterBuilder* filter_builder,
                          bool delete_rate_limit_data,
                          base::OnceClosure done) = 0;
+
+  virtual attribution_reporting::mojom::OsSupport GetOsSupport() = 0;
 };
 
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index e41c03b..dcf4939 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -68,7 +68,6 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/render_process_host.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
@@ -90,9 +89,6 @@
 using ScopedUseInMemoryStorageForTesting =
     ::content::AttributionManagerImpl::ScopedUseInMemoryStorageForTesting;
 
-using ScopedOsSupportForTesting =
-    ::content::AttributionManagerImpl::ScopedOsSupportForTesting;
-
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum class ConversionReportSendOutcome {
@@ -328,28 +324,6 @@
 
 bool g_run_in_memory = false;
 
-// This flag is per device and can only be changed by the OS.
-//
-// TODO(linnan): As currently we don't listen to the flag changes on the OS and
-// the API is synchronous, consider changing this to be per instance instead of
-// global which is set on creation. The renderer would be initialized with the
-// instance value without further updates.
-attribution_reporting::mojom::OsSupport g_os_support =
-    attribution_reporting::mojom::OsSupport::kDisabled;
-
-void SetOsSupport(attribution_reporting::mojom::OsSupport os_support) {
-  if (g_os_support == os_support) {
-    return;
-  }
-
-  g_os_support = os_support;
-
-  for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
-       !it.IsAtEnd(); it.Advance()) {
-    it.GetCurrentValue()->SetOsSupportForAttributionReporting(g_os_support);
-  }
-}
-
 }  // namespace
 
 struct AttributionManagerImpl::SourceOrTriggerRFH {
@@ -384,16 +358,6 @@
   g_run_in_memory = previous_;
 }
 
-ScopedOsSupportForTesting::ScopedOsSupportForTesting(
-    attribution_reporting::mojom::OsSupport os_support)
-    : previous_(g_os_support) {
-  SetOsSupport(os_support);
-}
-
-ScopedOsSupportForTesting::~ScopedOsSupportForTesting() {
-  SetOsSupport(previous_);
-}
-
 // static
 std::unique_ptr<AttributionManagerImpl>
 AttributionManagerImpl::CreateWithNewDbForTesting(
@@ -412,11 +376,6 @@
       std::move(special_storage_policy));
 }
 
-// static
-attribution_reporting::mojom::OsSupport AttributionManagerImpl::GetOsSupport() {
-  return g_os_support;
-}
-
 bool AttributionManagerImpl::IsReportAllowed(
     const AttributionReport& report) const {
   const CommonSourceInfo& common_info =
@@ -509,10 +468,6 @@
           blink::features::kAttributionReportingCrossAppWeb)) {
     attribution_os_level_manager_ =
         std::make_unique<AttributionOsLevelManagerAndroid>();
-    // The measurement API status can only change when user changes the setting
-    // on the device, therefore it's fine to update the global variable to keep
-    // track of the latest setting.
-    SetOsSupport(attribution_os_level_manager_->GetOsSupport());
   }
 #endif
 }
@@ -1214,4 +1169,14 @@
 }
 #endif
 
+attribution_reporting::mojom::OsSupport AttributionManagerImpl::GetOsSupport() {
+#if BUILDFLAG(IS_ANDROID)
+  if (attribution_os_level_manager_) {
+    return attribution_os_level_manager_->GetOsSupport();
+  }
+#endif
+
+  return attribution_reporting::mojom::OsSupport::kDisabled;
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.h b/content/browser/attribution_reporting/attribution_manager_impl.h
index a739c366..0a141c7 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_manager_impl.h
@@ -96,22 +96,6 @@
     const bool previous_;
   };
 
-  class CONTENT_EXPORT ScopedOsSupportForTesting {
-   public:
-    explicit ScopedOsSupportForTesting(attribution_reporting::mojom::OsSupport);
-    ~ScopedOsSupportForTesting();
-
-    ScopedOsSupportForTesting(const ScopedOsSupportForTesting&) = delete;
-    ScopedOsSupportForTesting& operator=(const ScopedOsSupportForTesting&) =
-        delete;
-
-    ScopedOsSupportForTesting(ScopedOsSupportForTesting&&) = delete;
-    ScopedOsSupportForTesting& operator=(ScopedOsSupportForTesting&&) = delete;
-
-   private:
-    const attribution_reporting::mojom::OsSupport previous_;
-  };
-
   static std::unique_ptr<AttributionManagerImpl> CreateForTesting(
       const base::FilePath& user_data_directory,
       size_t max_pending_events,
@@ -127,10 +111,6 @@
       const base::FilePath& user_data_directory,
       scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy);
 
-  // Returns whether OS-level attribution is enabled. `kDisabled` is returned
-  // before the result is returned from the underlying platform (e.g. Android).
-  static attribution_reporting::mojom::OsSupport GetOsSupport();
-
   AttributionManagerImpl(
       StoragePartitionImpl* storage_partition,
       const base::FilePath& user_data_directory,
@@ -177,6 +157,14 @@
   void RemoveAttributionDataByDataKey(const DataKey& data_key,
                                       base::OnceClosure callback) override;
 
+  attribution_reporting::mojom::OsSupport GetOsSupport() override;
+
+#if BUILDFLAG(IS_ANDROID)
+  AttributionOsLevelManager* GetOsLevelManager() {
+    return attribution_os_level_manager_.get();
+  }
+#endif
+
  private:
   friend class AttributionManagerImplTest;
 
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
index 3d6b8c48..ae8330f 100644
--- a/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
+++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.cc
@@ -21,6 +21,7 @@
 #include "content/browser/attribution_reporting/attribution_input_event.h"
 #include "content/public/android/content_jni_headers/AttributionOsLevelManager_jni.h"
 #include "content/public/browser/browsing_data_filter_builder.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/android/gurl_android.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -147,9 +148,12 @@
 AttributionOsLevelManagerAndroid::GetOsSupport() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  return ConvertToOsSupport(
-      Java_AttributionOsLevelManager_getMeasurementApiStatus(
-          base::android::AttachCurrentThread(), jobj_));
+  if (!os_support_) {
+    os_support_ = ConvertToOsSupport(
+        Java_AttributionOsLevelManager_getMeasurementApiStatus(
+            base::android::AttachCurrentThread(), jobj_));
+  }
+  return *os_support_;
 }
 
 void AttributionOsLevelManagerAndroid::OnDataDeletionCompleted(
@@ -166,4 +170,10 @@
   pending_data_deletion_callbacks_.erase(it);
 }
 
+void AttributionOsLevelManagerAndroid::SetOsSupportForTesting(
+    attribution_reporting::mojom::OsSupport os_support) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  os_support_ = os_support;
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager_android.h b/content/browser/attribution_reporting/attribution_os_level_manager_android.h
index 43b67d9..804369b0 100644
--- a/content/browser/attribution_reporting/attribution_os_level_manager_android.h
+++ b/content/browser/attribution_reporting/attribution_os_level_manager_android.h
@@ -12,13 +12,17 @@
 #include "base/functional/callback_forward.h"
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
+#include "components/attribution_reporting/os_support.mojom-forward.h"
 #include "content/browser/attribution_reporting/attribution_os_level_manager.h"
+#include "content/common/content_export.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace content {
 
 // This class is responsible for communicating with java code to handle
 // registering events received on the web with Android.
-class AttributionOsLevelManagerAndroid : public AttributionOsLevelManager {
+class CONTENT_EXPORT AttributionOsLevelManagerAndroid
+    : public AttributionOsLevelManager {
  public:
   AttributionOsLevelManagerAndroid();
   ~AttributionOsLevelManagerAndroid() override;
@@ -54,10 +58,15 @@
   // This is exposed to JNI and therefore has to be public.
   void OnDataDeletionCompleted(JNIEnv* env, jint request_id);
 
+  void SetOsSupportForTesting(attribution_reporting::mojom::OsSupport);
+
  private:
   base::flat_map<int, base::OnceClosure> pending_data_deletion_callbacks_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
+  absl::optional<attribution_reporting::mojom::OsSupport> os_support_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
   base::android::ScopedJavaGlobalRef<jobject> jobj_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc
index 34541ba..e1205fe2 100644
--- a/content/browser/attribution_reporting/attribution_src_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -13,6 +13,8 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
+#include "build/buildflag.h"
 #include "components/aggregation_service/aggregation_service.mojom.h"
 #include "components/attribution_reporting/aggregatable_dedup_key.h"
 #include "components/attribution_reporting/os_support.mojom.h"
@@ -23,6 +25,8 @@
 #include "content/browser/attribution_reporting/attribution_constants.h"
 #include "content/browser/attribution_reporting/attribution_manager_impl.h"
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
+#include "content/browser/storage_partition_impl.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test.h"
@@ -48,6 +52,10 @@
 #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom.h"
 #include "url/gurl.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "content/browser/attribution_reporting/attribution_os_level_manager_android.h"
+#endif
+
 namespace content {
 
 namespace {
@@ -1313,9 +1321,9 @@
             "web");
 }
 
-IN_PROC_BROWSER_TEST_F(
-    AttributionSrcCrossAppWebEnabledBrowserTest,
-    OsLevelEnabledPriorToRendererInitialization_SetsSupportHeader) {
+#if BUILDFLAG(IS_ANDROID)
+IN_PROC_BROWSER_TEST_F(AttributionSrcCrossAppWebEnabledBrowserTest,
+                       OsLevelEnabled_SetsSupportHeader) {
   // Create a separate server as we cannot register a `ControllableHttpResponse`
   // after the server starts.
   auto https_server = std::make_unique<net::EmbeddedTestServer>(
@@ -1334,8 +1342,15 @@
           https_server.get(), "/register_source2");
   ASSERT_TRUE(https_server->Start());
 
-  AttributionManagerImpl::ScopedOsSupportForTesting scoped_os_support_setting(
-      attribution_reporting::mojom::OsSupport::kEnabled);
+  auto* os_level_manager =
+      static_cast<AttributionManagerImpl*>(
+          static_cast<StoragePartitionImpl*>(
+              web_contents()->GetBrowserContext()->GetDefaultStoragePartition())
+              ->GetAttributionManager())
+          ->GetOsLevelManager();
+  static_cast<AttributionOsLevelManagerAndroid*>(os_level_manager)
+      ->SetOsSupportForTesting(
+          attribution_reporting::mojom::OsSupport::kEnabled);
 
   GURL page_url =
       https_server->GetURL("b.test", "/page_with_impression_creator.html");
@@ -1362,55 +1377,6 @@
                 "Attribution-Reporting-Support"),
             "web, os");
 }
-
-IN_PROC_BROWSER_TEST_F(
-    AttributionSrcCrossAppWebEnabledBrowserTest,
-    OsLevelEnabledPostRendererInitialization_SetsSupportHeader) {
-  // Create a separate server as we cannot register a `ControllableHttpResponse`
-  // after the server starts.
-  auto https_server = std::make_unique<net::EmbeddedTestServer>(
-      net::EmbeddedTestServer::TYPE_HTTPS);
-  https_server->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
-  net::test_server::RegisterDefaultHandlers(https_server.get());
-  https_server->ServeFilesFromSourceDirectory(
-      "content/test/data/attribution_reporting");
-  https_server->ServeFilesFromSourceDirectory("content/test/data");
-
-  auto register_response1 =
-      std::make_unique<net::test_server::ControllableHttpResponse>(
-          https_server.get(), "/register_source1");
-  auto register_response2 =
-      std::make_unique<net::test_server::ControllableHttpResponse>(
-          https_server.get(), "/register_source2");
-  ASSERT_TRUE(https_server->Start());
-
-  GURL page_url =
-      https_server->GetURL("b.test", "/page_with_impression_creator.html");
-  ASSERT_TRUE(NavigateToURL(web_contents(), page_url));
-
-  AttributionManagerImpl::ScopedOsSupportForTesting scoped_os_support_setting(
-      attribution_reporting::mojom::OsSupport::kEnabled);
-
-  GURL register_url = https_server->GetURL("d.test", "/register_source1");
-  ASSERT_TRUE(ExecJs(web_contents(),
-                     JsReplace("createAttributionSrcImg($1);", register_url)));
-
-  register_response1->WaitForRequest();
-  ASSERT_EQ(register_response1->http_request()->headers.at(
-                "Attribution-Reporting-Support"),
-            "web, os");
-
-  auto http_response = std::make_unique<net::test_server::BasicHttpResponse>();
-  http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
-  http_response->AddCustomHeader("Location", "/register_source2");
-  register_response1->Send(http_response->ToResponseString());
-  register_response1->Done();
-
-  // Ensure that redirect requests also contain the header.
-  register_response2->WaitForRequest();
-  ASSERT_EQ(register_response2->http_request()->headers.at(
-                "Attribution-Reporting-Support"),
-            "web, os");
-}
+#endif  // BUILDFLAG(IS_ANDROID)
 
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h
index 4784c9ae..45c23885 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.h
+++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -322,6 +322,11 @@
                base::OnceClosure callback),
               (override));
 
+  MOCK_METHOD(attribution_reporting::mojom::OsSupport,
+              GetOsSupport,
+              (),
+              (override));
+
   void AddObserver(AttributionObserver* observer) override;
   void RemoveObserver(AttributionObserver* observer) override;
   AttributionDataHostManager* GetDataHostManager() override;
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc
index 99995732..6913f8c 100644
--- a/content/browser/attribution_reporting/attributions_browsertest.cc
+++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -23,7 +23,6 @@
 #include "build/buildflag.h"
 #include "components/attribution_reporting/os_support.mojom.h"
 #include "content/browser/attribution_reporting/attribution_constants.h"
-#include "content/browser/attribution_reporting/attribution_data_host_manager.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/attribution_reporting/attribution_manager_impl.h"
 #include "content/browser/attribution_reporting/attribution_test_utils.h"
@@ -77,6 +76,10 @@
 #include "url/gurl.h"
 #include "url/origin.h"
 
+#if BUILDFLAG(IS_ANDROID)
+#include "content/browser/attribution_reporting/attribution_os_level_manager_android.h"
+#endif
+
 namespace content {
 
 namespace {
@@ -1584,6 +1587,7 @@
             "web");
 }
 
+#if BUILDFLAG(IS_ANDROID)
 IN_PROC_BROWSER_TEST_F(
     AttributionsCrossAppWebEnabledBrowserTest,
     AttributionEligibleNavigationOsLevelEnabled_SetsSupportHeader) {
@@ -1595,13 +1599,16 @@
           https_server(), "/register_source_redirect2");
   ASSERT_TRUE(https_server()->Start());
 
+  static_cast<AttributionOsLevelManagerAndroid*>(
+      static_cast<AttributionManagerImpl*>(attribution_manager())
+          ->GetOsLevelManager())
+      ->SetOsSupportForTesting(
+          attribution_reporting::mojom::OsSupport::kEnabled);
+
   GURL impression_url = https_server()->GetURL(
       "a.test", "/attribution_reporting/page_with_impression_creator.html");
   EXPECT_TRUE(NavigateToURL(web_contents(), impression_url));
 
-  AttributionManagerImpl::ScopedOsSupportForTesting scoped_os_support_setting(
-      attribution_reporting::mojom::OsSupport::kEnabled);
-
   GURL register_source_url =
       https_server()->GetURL("d.test", "/register_source_redirect");
 
@@ -1633,6 +1640,7 @@
                 "Attribution-Reporting-Support"),
             "web, os");
 }
+#endif  // BUILDFLAG(IS_ANDROID)
 
 IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest,
                        NoMatchingSourceDebugReporting_DebugReportSent) {
@@ -1718,7 +1726,7 @@
             ->GetPrimaryMainFrame()
             ->GetStoragePartition()
             ->GetURLLoaderFactoryForBrowserProcess(),
-        AttributionDataHostManager::FromBrowserContext(
+        AttributionManager::FromBrowserContext(
             web_contents()->GetBrowserContext()),
         /*direct_seller_is_seller=*/false,
         PrivateAggregationManager::GetManager(
diff --git a/content/browser/buckets/bucket_host.cc b/content/browser/buckets/bucket_host.cc
index 16fdeae..3057963 100644
--- a/content/browser/buckets/bucket_host.cc
+++ b/content/browser/buckets/bucket_host.cc
@@ -202,7 +202,7 @@
     storage::QuotaErrorOr<storage::BucketInfo> bucket_info) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!bucket_info.ok()) {
+  if (!bucket_info.has_value()) {
     bucket_info_ = {};
     std::move(callback).Run(false);
     return;
diff --git a/content/browser/buckets/bucket_manager_host.cc b/content/browser/buckets/bucket_manager_host.cc
index 2e8c7f7e..80a82cbdf 100644
--- a/content/browser/buckets/bucket_manager_host.cc
+++ b/content/browser/buckets/bucket_manager_host.cc
@@ -134,7 +134,7 @@
     return;
   }
 
-  if (!result.ok()) {
+  if (!result.has_value()) {
     auto error = [](storage::QuotaError code) {
       switch (code) {
         case storage::QuotaError::kQuotaExceeded:
@@ -172,7 +172,7 @@
 void BucketManagerHost::DidGetBuckets(
     KeysCallback callback,
     storage::QuotaErrorOr<std::set<storage::BucketInfo>> buckets) {
-  if (!buckets.ok()) {
+  if (!buckets.has_value()) {
     std::move(callback).Run({}, false);
     return;
   }
diff --git a/content/browser/buckets/bucket_manager_host_unittest.cc b/content/browser/buckets/bucket_manager_host_unittest.cc
index 4c246151..df65adbb 100644
--- a/content/browser/buckets/bucket_manager_host_unittest.cc
+++ b/content/browser/buckets/bucket_manager_host_unittest.cc
@@ -150,7 +150,7 @@
       blink::StorageKey::CreateFromStringForTesting(kTestUrl), "inbox_bucket",
       blink::mojom::StorageType::kTemporary, bucket_future.GetCallback());
   auto result = bucket_future.Take();
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_GT(result->id.value(), 0u);
 }
 
@@ -225,7 +225,7 @@
       blink::StorageKey::CreateFromStringForTesting(kTestUrl), "inbox_bucket",
       blink::mojom::StorageType::kTemporary, bucket_future.GetCallback());
   auto result = bucket_future.Take();
-  EXPECT_FALSE(result.ok());
+  EXPECT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), storage::QuotaError::kNotFound);
 }
 
diff --git a/content/browser/cache_storage/cache_storage_cache_unittest.cc b/content/browser/cache_storage/cache_storage_cache_unittest.cc
index 30fb390..a067ed1 100644
--- a/content/browser/cache_storage/cache_storage_cache_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_cache_unittest.cc
@@ -596,7 +596,7 @@
         base::SingleThreadTaskRunner::GetCurrentDefault(),
         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/content/browser/cache_storage/cache_storage_context_impl.cc b/content/browser/cache_storage/cache_storage_context_impl.cc
index d6115bbc9..e6fabb7 100644
--- a/content/browser/cache_storage/cache_storage_context_impl.cc
+++ b/content/browser/cache_storage/cache_storage_context_impl.cc
@@ -125,7 +125,8 @@
         bucket_locator.id, base::SequencedTaskRunner::GetCurrentDefault(),
         std::move(add_receiver));
   } else {
-    std::move(add_receiver).Run(storage::QuotaError::kNotFound);
+    std::move(add_receiver)
+        .Run(base::unexpected(storage::QuotaError::kNotFound));
   }
 }
 
@@ -174,8 +175,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const absl::optional<storage::BucketLocator> bucket =
-      result.ok() ? absl::make_optional(result->ToBucketLocator())
-                  : absl::nullopt;
+      result.has_value() ? absl::make_optional(result->ToBucketLocator())
+                         : absl::nullopt;
 
   dispatcher_host_->AddReceiver(cross_origin_embedder_policy,
                                 std::move(coep_reporter), storage_key, bucket,
diff --git a/content/browser/cache_storage/cache_storage_context_unittest.cc b/content/browser/cache_storage/cache_storage_context_unittest.cc
index eb7e3567..8b849e9 100644
--- a/content/browser/cache_storage/cache_storage_context_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_context_unittest.cc
@@ -120,7 +120,7 @@
       quota_manager_proxy_sync.GetBucket(
           blink::StorageKey::CreateFromStringForTesting(kExampleStorageKey),
           storage::kDefaultBucketName, blink::mojom::StorageType::kTemporary);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key,
             blink::StorageKey::CreateFromStringForTesting(kExampleStorageKey));
@@ -130,7 +130,7 @@
   result = quota_manager_proxy_sync.GetBucket(
       blink::StorageKey::CreateFromStringForTesting(kGoogleStorageKey),
       storage::kDefaultBucketName, blink::mojom::StorageType::kTemporary);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key,
             blink::StorageKey::CreateFromStringForTesting(kGoogleStorageKey));
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
index 50fe00b..ab04914 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -1022,7 +1022,7 @@
   void UpdateOrCreateBucketCallback(
       base::OnceCallback<void(content::CacheStorage*)> callback,
       storage::QuotaErrorOr<storage::BucketInfo> result) {
-    if (result.ok()) {
+    if (result.has_value()) {
       bucket_ = result->ToBucketLocator();
     } else {
       bucket_ = absl::nullopt;
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index 3abc7ef..6442c9f 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -288,7 +288,7 @@
         callback,
     storage::QuotaErrorOr<storage::BucketInfo> result) {
   storage::BucketLocator bucket_locator{};
-  if (result.ok()) {
+  if (result.has_value()) {
     bucket_locator = result->ToBucketLocator();
     DCHECK_EQ(info->storage_key, result->storage_key);
   }
diff --git a/content/browser/cache_storage/cache_storage_manager_unittest.cc b/content/browser/cache_storage/cache_storage_manager_unittest.cc
index 8339eef..29e68e5 100644
--- a/content/browser/cache_storage/cache_storage_manager_unittest.cc
+++ b/content/browser/cache_storage/cache_storage_manager_unittest.cc
@@ -847,7 +847,7 @@
         base::SingleThreadTaskRunner::GetCurrentDefault(),
         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index ac926583..6025896a 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -16,7 +16,7 @@
 #include "base/time/time.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/ukm/test_ukm_recorder.h"
-#include "content/browser/attribution_reporting/attribution_data_host_manager.h"
+#include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/back_forward_cache_browsertest.h"
 #include "content/browser/fenced_frame/fenced_frame.h"
 #include "content/browser/fenced_frame/fenced_frame_reporter.h"
@@ -4645,7 +4645,7 @@
             ->GetPrimaryMainFrame()
             ->GetStoragePartition()
             ->GetURLLoaderFactoryForBrowserProcess(),
-        AttributionDataHostManager::FromBrowserContext(
+        AttributionManager::FromBrowserContext(
             web_contents()->GetBrowserContext()),
         /*direct_seller_is_seller=*/false,
         PrivateAggregationManager::GetManager(
@@ -6077,7 +6077,7 @@
             ->GetPrimaryMainFrame()
             ->GetStoragePartition()
             ->GetURLLoaderFactoryForBrowserProcess(),
-        AttributionDataHostManager::FromBrowserContext(
+        AttributionManager::FromBrowserContext(
             web_contents()->GetBrowserContext()),
         /*direct_seller_is_seller=*/false,
         static_cast<StoragePartitionImpl*>(
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.cc b/content/browser/fenced_frame/fenced_frame_reporter.cc
index c3094d8..27f59cc8 100644
--- a/content/browser/fenced_frame/fenced_frame_reporter.cc
+++ b/content/browser/fenced_frame/fenced_frame_reporter.cc
@@ -170,14 +170,14 @@
 
 scoped_refptr<FencedFrameReporter> FencedFrameReporter::CreateForSharedStorage(
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     ReportingUrlMap reporting_url_map) {
   // `private_aggregation_manager_`, `main_frame_origin_`, and `winner_origin_`
   // are only needed by FLEDGE.
   scoped_refptr<FencedFrameReporter> reporter =
       base::MakeRefCounted<FencedFrameReporter>(
           base::PassKey<FencedFrameReporter>(), std::move(url_loader_factory),
-          attribution_data_host_manager);
+          attribution_manager);
   reporter->reporting_metadata_.emplace(
       blink::FencedFrame::ReportingDestination::kSharedStorageSelectUrl,
       ReportingDestinationInfo(std::move(reporting_url_map)));
@@ -186,7 +186,7 @@
 
 scoped_refptr<FencedFrameReporter> FencedFrameReporter::CreateForFledge(
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     bool direct_seller_is_seller,
     PrivateAggregationManager* private_aggregation_manager,
     const url::Origin& main_frame_origin,
@@ -194,8 +194,8 @@
   scoped_refptr<FencedFrameReporter> reporter =
       base::MakeRefCounted<FencedFrameReporter>(
           base::PassKey<FencedFrameReporter>(), std::move(url_loader_factory),
-          attribution_data_host_manager, private_aggregation_manager,
-          main_frame_origin, winner_origin);
+          attribution_manager, private_aggregation_manager, main_frame_origin,
+          winner_origin);
   reporter->direct_seller_is_seller_ = direct_seller_is_seller;
   reporter->reporting_metadata_.emplace(
       blink::FencedFrame::ReportingDestination::kBuyer,
@@ -212,12 +212,12 @@
 FencedFrameReporter::FencedFrameReporter(
     base::PassKey<FencedFrameReporter> pass_key,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     PrivateAggregationManager* private_aggregation_manager,
     const absl::optional<url::Origin>& main_frame_origin,
     const absl::optional<url::Origin>& winner_origin)
     : url_loader_factory_(std::move(url_loader_factory)),
-      attribution_data_host_manager_(attribution_data_host_manager),
+      attribution_manager_(attribution_manager),
       private_aggregation_manager_(private_aggregation_manager),
       main_frame_origin_(main_frame_origin),
       winner_origin_(winner_origin) {
@@ -361,15 +361,19 @@
   request->trusted_params = network::ResourceRequest::TrustedParams();
   request->trusted_params->isolation_info =
       net::IsolationInfo::CreateTransient();
-  request->headers.SetHeader("Attribution-Reporting-Eligible",
-                             absl::holds_alternative<EventBeaconId>(beacon_id)
-                                 ? "event-source"
-                                 : "navigation-source");
-  if (base::FeatureList::IsEnabled(
-          blink::features::kAttributionReportingCrossAppWeb)) {
-    request->headers.SetHeader("Attribution-Reporting-Support",
-                               attribution_reporting::GetSupportHeader(
-                                   AttributionManager::GetOsSupport()));
+
+  if (attribution_manager_) {
+    request->headers.SetHeader("Attribution-Reporting-Eligible",
+                               absl::holds_alternative<EventBeaconId>(beacon_id)
+                                   ? "event-source"
+                                   : "navigation-source");
+
+    if (base::FeatureList::IsEnabled(
+            blink::features::kAttributionReportingCrossAppWeb)) {
+      request->headers.SetHeader("Attribution-Reporting-Support",
+                                 attribution_reporting::GetSupportHeader(
+                                     attribution_manager_->GetOsSupport()));
+    }
   }
 
   // Create and configure `SimpleURLLoader` instance.
@@ -381,7 +385,11 @@
 
   network::SimpleURLLoader* simple_url_loader_ptr = simple_url_loader.get();
 
-  if (attribution_data_host_manager_) {
+  AttributionDataHostManager* attribution_data_host_manager =
+      attribution_manager_ ? attribution_manager_->GetDataHostManager()
+                           : nullptr;
+
+  if (attribution_data_host_manager) {
     // Notify Attribution Reporting API for the beacons.
     simple_url_loader_ptr->SetOnRedirectCallback(base::BindRepeating(
         [](base::WeakPtr<AttributionDataHostManager>
@@ -397,7 +405,7 @@
                 /*is_final_response=*/false);
           }
         },
-        attribution_data_host_manager_->AsWeakPtr(), beacon_id));
+        attribution_data_host_manager->AsWeakPtr(), beacon_id));
 
     // Send out the reporting beacon.
     simple_url_loader_ptr->DownloadHeadersOnly(
@@ -416,10 +424,10 @@
                         /*is_final_response=*/true);
               }
             },
-            attribution_data_host_manager_->AsWeakPtr(), beacon_id,
+            attribution_data_host_manager->AsWeakPtr(), beacon_id,
             std::move(simple_url_loader)));
 
-    attribution_data_host_manager_->NotifyFencedFrameReportingBeaconSent(
+    attribution_data_host_manager->NotifyFencedFrameReportingBeaconSent(
         beacon_id);
   } else {
     // Send out the reporting beacon.
diff --git a/content/browser/fenced_frame/fenced_frame_reporter.h b/content/browser/fenced_frame/fenced_frame_reporter.h
index 4e09cf7..e4ef6aa2 100644
--- a/content/browser/fenced_frame/fenced_frame_reporter.h
+++ b/content/browser/fenced_frame/fenced_frame_reporter.h
@@ -28,7 +28,7 @@
 
 namespace content {
 
-class AttributionDataHostManager;
+class AttributionManager;
 class PrivateAggregationManager;
 class RenderFrameHostImpl;
 
@@ -65,11 +65,11 @@
   // destinations, using the passed in map.
   //
   // `url_loader_factory` is used to send all reports, and must not be null.
-  // `attribution_data_host_manager` is used to notify Attribution Reporting API
+  // `attribution_manager` is used to notify Attribution Reporting API
   // for the beacons.
   static scoped_refptr<FencedFrameReporter> CreateForSharedStorage(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       ReportingUrlMap reporting_url_map);
 
   // Creates a FencedFrameReporter that maps FLEDGE ReportingDestination types
@@ -79,7 +79,7 @@
   //
   // `url_loader_factory` is used to send all reports, and must not be null.
   //
-  // `attribution_data_host_manager` is used to notify Attribution Reporting API
+  // `attribution_manager` is used to notify Attribution Reporting API
   // for the beacons.
   //
   // `private_aggregation_manager` is used to send private aggregation requests
@@ -94,7 +94,7 @@
   // test iff the test does not have for event private aggregation requests.
   static scoped_refptr<FencedFrameReporter> CreateForFledge(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       bool direct_seller_is_seller,
       PrivateAggregationManager* private_aggregation_manager,
       const url::Origin& main_frame_origin,
@@ -105,7 +105,7 @@
   FencedFrameReporter(
       base::PassKey<FencedFrameReporter> pass_key,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       PrivateAggregationManager* private_aggregation_manager = nullptr,
       const absl::optional<url::Origin>& main_frame_origin = absl::nullopt,
       const absl::optional<url::Origin>& winner_origin = absl::nullopt);
@@ -290,7 +290,7 @@
 
   // Bound to the lifetime of the browser context. Could be null in Incognito
   // mode or in test.
-  const raw_ptr<AttributionDataHostManager> attribution_data_host_manager_;
+  const raw_ptr<AttributionManager> attribution_manager_;
 
   base::flat_map<blink::FencedFrame::ReportingDestination,
                  ReportingDestinationInfo>
diff --git a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc
index 18f2298c..8dcb1b63 100644
--- a/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc
+++ b/content/browser/fenced_frame/fenced_frame_reporter_unittest.cc
@@ -12,7 +12,6 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_piece.h"
-#include "content/browser/attribution_reporting/attribution_data_host_manager.h"
 #include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/interest_group/test_interest_group_private_aggregation_manager.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
@@ -82,8 +81,8 @@
     return test_url_loader_factory_.GetSafeWeakWrapper();
   }
 
-  AttributionDataHostManager* attribution_data_host_manager() {
-    return AttributionDataHostManager::FromBrowserContext(browser_context());
+  AttributionManager* attribution_manager() {
+    return AttributionManager::FromBrowserContext(browser_context());
   }
 
   void SetUp() override {
@@ -149,7 +148,7 @@
 TEST_F(FencedFrameReporterTest, NoReportNoMap) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*reporting_url_map=*/{{"event_type", report_destination_}});
   std::string error_message;
   // A Shared Storage FencedFrameReporter has no map for FLEDGE destinations.
@@ -184,7 +183,7 @@
 
   // A FLEDGE FencedFrameReporter has no map for Shared Storage.
   reporter = FencedFrameReporter::CreateForFledge(
-      shared_url_loader_factory(), attribution_data_host_manager(),
+      shared_url_loader_factory(), attribution_manager(),
       /*direct_seller_is_seller=*/false, &private_aggregation_manager_,
       main_frame_origin_,
       /*winner_origin=*/report_destination_origin_);
@@ -203,9 +202,9 @@
 // ReportingDestination has an empty map.
 TEST_F(FencedFrameReporterTest, NoReportEmptyMap) {
   scoped_refptr<FencedFrameReporter> reporter =
-      FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
-          /*reporting_url_map=*/{});
+      FencedFrameReporter::CreateForSharedStorage(shared_url_loader_factory(),
+                                                  attribution_manager(),
+                                                  /*reporting_url_map=*/{});
   std::string error_message;
   EXPECT_FALSE(reporter->SendReport(
       "event_type", "event_data",
@@ -223,7 +222,7 @@
 TEST_F(FencedFrameReporterTest, NoReportEventTypeNotRegistered) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*reporting_url_map=*/
           {{"registered_event_type", report_destination_}});
   std::string error_message;
@@ -244,7 +243,7 @@
 TEST_F(FencedFrameReporterTest, NoReportBadUrl) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*reporting_url_map=*/
           {{"no_url", GURL()},
            {"data_url", GURL("data:,only http is allowed")}});
@@ -271,7 +270,7 @@
 TEST_F(FencedFrameReporterTest, SendReports) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*reporting_url_map=*/
           {{"event_type", report_destination_},
            {"event_type2", report_destination2_}});
@@ -311,7 +310,7 @@
 TEST_F(FencedFrameReporterTest, SendFledgeReportsAfterMapsReceived) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/false, &private_aggregation_manager_,
           main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -369,7 +368,7 @@
 TEST_F(FencedFrameReporterTest, SendReportsFledgeBeforeMapsReceived) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/true, &private_aggregation_manager_,
           main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -431,7 +430,7 @@
 TEST_F(FencedFrameReporterTest, SendFledgeReportsBeforeMapsReceivedWithErrors) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/false, &private_aggregation_manager_,
           main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -477,7 +476,7 @@
   private_aggregation_manager_.SetShouldMatchLoggedRequests(false);
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/false, &private_aggregation_manager_,
           main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -563,7 +562,7 @@
   private_aggregation_manager_.SetShouldMatchLoggedRequests(false);
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/false, &private_aggregation_manager_,
           main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -651,7 +650,7 @@
 TEST_F(FencedFrameReporterTest, FledgeEventsReceivedUnexpectedly) {
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForFledge(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*direct_seller_is_seller=*/false,
           /*private_aggregation_manager=*/nullptr, main_frame_origin_,
           /*winner_origin=*/report_destination_origin_);
@@ -665,11 +664,11 @@
 }
 
 TEST_F(FencedFrameReporterTest, AttributionManagerShutDown_NoCrash) {
-  EXPECT_TRUE(attribution_data_host_manager());
+  EXPECT_TRUE(attribution_manager());
 
   scoped_refptr<FencedFrameReporter> reporter =
       FencedFrameReporter::CreateForSharedStorage(
-          shared_url_loader_factory(), attribution_data_host_manager(),
+          shared_url_loader_factory(), attribution_manager(),
           /*reporting_url_map=*/
           {{"event_type", report_destination_}});
 
@@ -685,7 +684,7 @@
 
   ShutDownAttributionManager();
 
-  EXPECT_FALSE(attribution_data_host_manager());
+  EXPECT_FALSE(attribution_manager());
 
   EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
       report_destination_.spec(), ""));
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
index 22112da..72511fb 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
@@ -128,7 +128,7 @@
 scoped_refptr<FencedFrameReporter> CreateReporter() {
   return FencedFrameReporter::CreateForFledge(
       base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(nullptr),
-      /*attribution_data_host_manager=*/nullptr,
+      /*attribution_manager=*/nullptr,
       /*direct_seller_is_seller=*/false,
       /*private_aggregation_manager=*/nullptr,
       /*main_frame_origin=*/url::Origin(),
diff --git a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
index bab080f..6cbd24b 100644
--- a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
+++ b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
@@ -513,7 +513,7 @@
   // Create a reporting service with a dummy SharedURLLoaderFactory.
   properties.fenced_frame_reporter_ = FencedFrameReporter::CreateForFledge(
       base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(nullptr),
-      /*attribution_data_host_manager=*/nullptr,
+      /*attribution_manager=*/nullptr,
       /*direct_seller_is_seller=*/false,
       /*private_aggregation_manager=*/nullptr,
       /*main_frame_origin=*/url::Origin(),
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
index 123290d..5c2d8b5 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
@@ -137,7 +137,7 @@
         base::SequencedTaskRunner::GetCurrentDefault(),
         bucket_future.GetCallback());
     auto bucket = bucket_future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/content/browser/file_system_access/file_system_access_manager_impl.cc b/content/browser/file_system_access/file_system_access_manager_impl.cc
index 7eb181a7..974cb39 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl.cc
@@ -925,7 +925,7 @@
           [](storage::FileSystemURL url,
              base::OnceCallback<void(const storage::FileSystemURL&)> callback,
              storage::QuotaErrorOr<storage::BucketInfo> result) {
-            if (!result.ok()) {
+            if (!result.has_value()) {
               // Drop `token`, and directly return.
               return;
             }
diff --git a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
index 7f1cd20e..b958f46 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
@@ -378,7 +378,7 @@
         base::SequencedTaskRunner::GetCurrentDefault(),
         bucket_future.GetCallback());
     auto bucket = bucket_future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
@@ -405,7 +405,7 @@
         quota_manager_proxy_sync.GetBucket(
             kTestStorageKey, storage::kDefaultBucketName,
             blink::mojom::StorageType::kTemporary);
-    EXPECT_TRUE(result.ok());
+    EXPECT_TRUE(result.has_value());
     EXPECT_EQ(result->name, storage::kDefaultBucketName);
     EXPECT_EQ(result->storage_key, kTestStorageKey);
     EXPECT_GT(result->id.value(), 0);
@@ -474,7 +474,7 @@
       base::SequencedTaskRunner::GetCurrentDefault(),
       bucket_future.GetCallback());
   auto bucket = bucket_future.Take();
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
 
   base::test::TestFuture<
       blink::mojom::FileSystemAccessErrorPtr,
diff --git a/content/browser/generic_sensor/sensor_provider_proxy_impl.cc b/content/browser/generic_sensor/sensor_provider_proxy_impl.cc
index bffcac89..03579f3e 100644
--- a/content/browser/generic_sensor/sensor_provider_proxy_impl.cc
+++ b/content/browser/generic_sensor/sensor_provider_proxy_impl.cc
@@ -37,9 +37,7 @@
 
 SensorProviderProxyImpl::SensorProviderProxyImpl(
     RenderFrameHost* render_frame_host)
-    : DocumentUserData<SensorProviderProxyImpl>(render_frame_host) {
-  DCHECK(render_frame_host);
-}
+    : DocumentUserData<SensorProviderProxyImpl>(render_frame_host) {}
 
 SensorProviderProxyImpl::~SensorProviderProxyImpl() = default;
 
diff --git a/content/browser/indexed_db/indexed_db_browsertest.cc b/content/browser/indexed_db/indexed_db_browsertest.cc
index 1fdc3e8..9f0de33 100644
--- a/content/browser/indexed_db/indexed_db_browsertest.cc
+++ b/content/browser/indexed_db/indexed_db_browsertest.cc
@@ -401,7 +401,7 @@
           ->GetOrCreateBucketSync(storage::BucketInitParams::ForDefaultBucket(
               blink::StorageKey::CreateFirstParty(
                   url::Origin::Create(database_open_url))));
-  ASSERT_TRUE(maybe_bucket_info.ok());
+  ASSERT_TRUE(maybe_bucket_info.has_value());
   const auto bucket_locator = maybe_bucket_info->ToBucketLocator();
 
   auto control_test = GetControlTest();
@@ -440,7 +440,7 @@
           ->GetOrCreateBucketSync(storage::BucketInitParams::ForDefaultBucket(
               blink::StorageKey::CreateFirstParty(
                   url::Origin::Create(database_open_url))));
-  ASSERT_TRUE(maybe_bucket_info.ok());
+  ASSERT_TRUE(maybe_bucket_info.has_value());
   const auto bucket_locator = maybe_bucket_info->ToBucketLocator();
 
   auto control_test = GetControlTest();
@@ -774,7 +774,7 @@
           ->proxy()
           ->GetOrCreateBucketSync(
               storage::BucketInitParams::ForDefaultBucket(kTestStorageKey));
-  ASSERT_TRUE(maybe_bucket_info.ok());
+  ASSERT_TRUE(maybe_bucket_info.has_value());
   const auto bucket_locator = maybe_bucket_info->ToBucketLocator();
   EXPECT_EQ(0,
             RequestBlobFileCount(bucket_locator));  // Start with no blob files.
@@ -1068,7 +1068,7 @@
           base::SequencedTaskRunner::GetCurrentDefault(),
           base::BindLambdaForTesting(
               [&](storage::QuotaErrorOr<storage::BucketInfo> result) {
-                ASSERT_TRUE(result.ok());
+                ASSERT_TRUE(result.has_value());
                 bucket_locator = result->ToBucketLocator();
                 loop.Quit();
               }));
@@ -1239,7 +1239,7 @@
           ->GetOrCreateBucketSync(storage::BucketInitParams::ForDefaultBucket(
               blink::StorageKey::CreateFirstParty(
                   url::Origin::Create(embedded_test_server()->base_url()))));
-  ASSERT_TRUE(maybe_bucket_info.ok());
+  ASSERT_TRUE(maybe_bucket_info.has_value());
   const auto bucket_locator = maybe_bucket_info->ToBucketLocator();
 
   // Verify the backing store does not have corruption.
@@ -1335,7 +1335,7 @@
           ->GetOrCreateBucketSync(storage::BucketInitParams::ForDefaultBucket(
               blink::StorageKey::CreateFirstParty(
                   url::Origin::Create(embedded_test_server()->base_url()))));
-  ASSERT_TRUE(maybe_bucket_info.ok());
+  ASSERT_TRUE(maybe_bucket_info.has_value());
   const auto bucket_locator = maybe_bucket_info->ToBucketLocator();
   int64_t next_blob_number = GetNextBlobNumber(bucket_locator, 1);
 
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc
index 38c35007..0688b3663 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.cc
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -210,8 +210,9 @@
     mojo::PendingReceiver<blink::mojom::IDBFactory> receiver,
     storage::QuotaErrorOr<storage::BucketInfo> bucket_info) {
   absl::optional<storage::BucketInfo> bucket;
-  if (bucket_info.ok())
+  if (bucket_info.has_value()) {
     bucket = bucket_info.value();
+  }
   dispatcher_host_.AddReceiver(
       IndexedDBDispatcherHost::ReceiverContext(
           bucket, std::move(client_state_checker_remote)),
@@ -264,8 +265,8 @@
 void IndexedDBContextImpl::OnGotBucketsForDeletion(
     base::OnceCallback<void(bool)> callback,
     storage::QuotaErrorOr<std::set<storage::BucketInfo>> buckets) {
-  if (!buckets.ok() || buckets.value().empty()) {
-    std::move(callback).Run(buckets.ok());
+  if (!buckets.has_value() || buckets.value().empty()) {
+    std::move(callback).Run(buckets.has_value());
     return;
   }
 
@@ -449,7 +450,7 @@
       bucket_map;
 
   for (const auto& quota_error_or_bucket_info : bucket_infos) {
-    if (!quota_error_or_bucket_info.ok()) {
+    if (!quota_error_or_bucket_info.has_value()) {
       continue;
     }
     const storage::BucketInfo& bucket_info = quota_error_or_bucket_info.value();
@@ -1160,10 +1161,11 @@
   auto on_lookup_done = base::BindRepeating(
       [](Barrier barrier,
          storage::QuotaErrorOr<storage::BucketInfo> bucket_info) {
-        if (bucket_info.ok())
+        if (bucket_info.has_value()) {
           barrier.Run(bucket_info->ToBucketLocator());
-        else
+        } else {
           barrier.Run(absl::nullopt);
+        }
       },
       barrier);
 
diff --git a/content/browser/indexed_db/indexed_db_context_unittest.cc b/content/browser/indexed_db/indexed_db_context_unittest.cc
index da5cca3..fe0bdbf 100644
--- a/content/browser/indexed_db/indexed_db_context_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_context_unittest.cc
@@ -139,7 +139,7 @@
       quota_manager_proxy_sync.GetBucket(example_storage_key_,
                                          storage::kDefaultBucketName,
                                          blink::mojom::StorageType::kTemporary);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key, example_storage_key_);
   EXPECT_GT(result->id.value(), 0);
@@ -148,7 +148,7 @@
   result = quota_manager_proxy_sync.GetBucket(
       google_storage_key_, storage::kDefaultBucketName,
       blink::mojom::StorageType::kTemporary);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key, google_storage_key_);
   EXPECT_GT(result->id.value(), 0);
diff --git a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
index 856e4f0..344a7d5a 100644
--- a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
@@ -189,7 +189,7 @@
     quota_manager_->GetBucketForTesting(storage_key, name, kTemp,
                                         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
@@ -199,7 +199,7 @@
     storage::BucketInitParams params(storage_key, name);
     quota_manager_->UpdateOrCreateBucket(params, future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
@@ -500,7 +500,7 @@
                                         storage::kDefaultBucketName, kTemp,
                                         bucket_future.GetCallback());
   auto bucket_a = bucket_future.Take();
-  EXPECT_TRUE(bucket_a.ok());
+  EXPECT_TRUE(bucket_a.has_value());
 
   // No FakeIndexDB is added.
   EXPECT_TRUE(GetStorageKeysForType(client, kTemp).empty());
@@ -529,7 +529,7 @@
                                         storage::kDefaultBucketName, kTemp,
                                         bucket_future.GetCallback());
   auto bucket_a = bucket_future.Take();
-  EXPECT_TRUE(bucket_a.ok());
+  EXPECT_TRUE(bucket_a.has_value());
 
   // No FakeIndexDB is added.
   EXPECT_TRUE(GetStorageKeysForType(client, kTemp).empty());
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index decadc0a..2418eaa 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -16,7 +16,7 @@
 #include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
-#include "content/browser/attribution_reporting/attribution_data_host_manager.h"
+#include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/devtools/devtools_instrumentation.h"
 #include "content/browser/fenced_frame/fenced_frame_reporter.h"
 #include "content/browser/fenced_frame/fenced_frame_url_mapping.h"
@@ -243,7 +243,7 @@
 
   std::unique_ptr<AuctionRunner> auction = AuctionRunner::CreateAndStart(
       &auction_worklet_manager_, &GetInterestGroupManager(),
-      AttributionDataHostManager::FromBrowserContext(
+      AttributionManager::FromBrowserContext(
           render_frame_host().GetBrowserContext()),
       private_aggregation_manager_,
       // Unlike other callbacks, this needs to be safe to call after destruction
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc
index 540d5123..0b47960 100644
--- a/content/browser/interest_group/auction_runner.cc
+++ b/content/browser/interest_group/auction_runner.cc
@@ -62,7 +62,7 @@
 std::unique_ptr<AuctionRunner> AuctionRunner::CreateAndStart(
     AuctionWorkletManager* auction_worklet_manager,
     InterestGroupManagerImpl* interest_group_manager,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     PrivateAggregationManager* private_aggregation_manager,
     InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
         log_private_aggregation_requests_callback,
@@ -75,11 +75,11 @@
     mojo::PendingReceiver<AbortableAdAuction> abort_receiver,
     RunAuctionCallback callback) {
   std::unique_ptr<AuctionRunner> instance(new AuctionRunner(
-      auction_worklet_manager, interest_group_manager,
-      attribution_data_host_manager, private_aggregation_manager,
-      log_private_aggregation_requests_callback, DetermineKAnonMode(),
-      std::move(auction_config), main_frame_origin, frame_origin,
-      std::move(client_security_state), std::move(url_loader_factory),
+      auction_worklet_manager, interest_group_manager, attribution_manager,
+      private_aggregation_manager, log_private_aggregation_requests_callback,
+      DetermineKAnonMode(), std::move(auction_config), main_frame_origin,
+      frame_origin, std::move(client_security_state),
+      std::move(url_loader_factory),
       std::move(is_interest_group_api_allowed_callback),
       std::move(abort_receiver), std::move(callback)));
   instance->StartAuction();
@@ -280,7 +280,7 @@
 AuctionRunner::AuctionRunner(
     AuctionWorkletManager* auction_worklet_manager,
     InterestGroupManagerImpl* interest_group_manager,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     PrivateAggregationManager* private_aggregation_manager,
     InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
         log_private_aggregation_requests_callback,
@@ -294,7 +294,7 @@
     mojo::PendingReceiver<AbortableAdAuction> abort_receiver,
     RunAuctionCallback callback)
     : interest_group_manager_(interest_group_manager),
-      attribution_data_host_manager_(attribution_data_host_manager),
+      attribution_manager_(attribution_manager),
       private_aggregation_manager_(private_aggregation_manager),
       log_private_aggregation_requests_callback_(
           log_private_aggregation_requests_callback),
@@ -360,7 +360,7 @@
 
   std::unique_ptr<InterestGroupAuctionReporter> reporter =
       auction_.CreateReporter(
-          attribution_data_host_manager_, private_aggregation_manager_,
+          attribution_manager_, private_aggregation_manager_,
           log_private_aggregation_requests_callback_, url_loader_factory_,
           std::move(owned_auction_config_), main_frame_origin_, frame_origin_,
           client_security_state_.Clone(), std::move(interest_groups_that_bid));
diff --git a/content/browser/interest_group/auction_runner.h b/content/browser/interest_group/auction_runner.h
index 3ba417d14..c33fa4b3 100644
--- a/content/browser/interest_group/auction_runner.h
+++ b/content/browser/interest_group/auction_runner.h
@@ -33,7 +33,7 @@
 
 namespace content {
 
-class AttributionDataHostManager;
+class AttributionManager;
 class InterestGroupAuctionReporter;
 class InterestGroupManagerImpl;
 class PrivateAggregationManager;
@@ -98,10 +98,10 @@
   //
   // Arguments:
   // `auction_worklet_manager`, `interest_group_manager`,
-  //  `attribution_data_host_manager`, and `private_aggregation_manager` must
+  //  `attribution_manager`, and `private_aggregation_manager` must
   //  remain valid, and `log_private_aggregation_requests_callback` must be safe
   //  to call until the AuctionRunner and any InterestGroupAuctionReporter it
-  //  returns are destroyed. `attribution_data_host_manager` could be null in
+  //  returns are destroyed. `attribution_manager` could be null in
   //  Incognito mode or in test.
   //
   // `log_private_aggregation_requests_callback` will be invoked with private
@@ -137,7 +137,7 @@
   static std::unique_ptr<AuctionRunner> CreateAndStart(
       AuctionWorkletManager* auction_worklet_manager,
       InterestGroupManagerImpl* interest_group_manager,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       PrivateAggregationManager* private_aggregation_manager,
       InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
           log_private_aggregation_requests_callback,
@@ -196,7 +196,7 @@
   AuctionRunner(
       AuctionWorkletManager* auction_worklet_manager,
       InterestGroupManagerImpl* interest_group_manager,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       PrivateAggregationManager* private_aggregation_manager,
       InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
           log_private_aggregation_requests_callback,
@@ -247,7 +247,7 @@
 
   // Needed to create `FencedFrameReporter`. Bound to the life time of the
   // browser context. Could be null in Incognito mode or in test.
-  const raw_ptr<AttributionDataHostManager> attribution_data_host_manager_;
+  const raw_ptr<AttributionManager> attribution_manager_;
 
   const raw_ptr<PrivateAggregationManager> private_aggregation_manager_;
 
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 9d5f23b..a4865c86 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -1434,8 +1434,7 @@
     abortable_ad_auction_.reset();
     auction_runner_ = AuctionRunner::CreateAndStart(
         auction_worklet_manager_.get(), interest_group_manager_.get(),
-        /*attribution_data_host_manager=*/nullptr,
-        &private_aggregation_manager_,
+        /*attribution_manager=*/nullptr, &private_aggregation_manager_,
         private_aggregation_manager_.GetLogPrivateAggregationRequestsCallback(),
         std::move(auction_config), top_frame_origin_, frame_origin_,
         GetClientSecurityState(), dummy_report_shared_url_loader_factory_,
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc
index 8bbf396..1325c81f 100644
--- a/content/browser/interest_group/interest_group_auction.cc
+++ b/content/browser/interest_group/interest_group_auction.cc
@@ -1464,7 +1464,7 @@
 
 std::unique_ptr<InterestGroupAuctionReporter>
 InterestGroupAuction::CreateReporter(
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     PrivateAggregationManager* private_aggregation_manager,
     InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
         log_private_aggregation_requests_callback,
@@ -1577,12 +1577,11 @@
       debug_win_report_urls, debug_loss_report_urls);
 
   return std::make_unique<InterestGroupAuctionReporter>(
-      interest_group_manager_, auction_worklet_manager_,
-      attribution_data_host_manager, private_aggregation_manager,
-      log_private_aggregation_requests_callback, std::move(auction_config),
-      main_frame_origin, frame_origin, std::move(client_security_state),
-      std::move(url_loader_factory), std::move(winning_bid_info),
-      std::move(top_level_seller_winning_bid_info),
+      interest_group_manager_, auction_worklet_manager_, attribution_manager,
+      private_aggregation_manager, log_private_aggregation_requests_callback,
+      std::move(auction_config), main_frame_origin, frame_origin,
+      std::move(client_security_state), std::move(url_loader_factory),
+      std::move(winning_bid_info), std::move(top_level_seller_winning_bid_info),
       std::move(component_seller_winning_bid_info),
       std::move(interest_groups_that_bid), std::move(debug_win_report_urls),
       std::move(debug_loss_report_urls), GetKAnonKeysToJoin(),
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h
index dae0a22f..12d34cb 100644
--- a/content/browser/interest_group/interest_group_auction.h
+++ b/content/browser/interest_group/interest_group_auction.h
@@ -43,7 +43,7 @@
 
 namespace content {
 
-class AttributionDataHostManager;
+class AttributionManager;
 class InterestGroupManagerImpl;
 class PrivateAggregationManager;
 
@@ -439,7 +439,7 @@
   // Takes ownership of the `auction_config`, so that the reporter can outlive
   // other auction-related classes.
   std::unique_ptr<InterestGroupAuctionReporter> CreateReporter(
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       PrivateAggregationManager* private_aggregation_manager,
       InterestGroupAuctionReporter::LogPrivateAggregationRequestsCallback
           log_private_aggregation_requests_callback,
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc
index 0dfa3972..1e05ddcb 100644
--- a/content/browser/interest_group/interest_group_auction_reporter.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -81,7 +81,7 @@
 InterestGroupAuctionReporter::InterestGroupAuctionReporter(
     InterestGroupManagerImpl* interest_group_manager,
     AuctionWorkletManager* auction_worklet_manager,
-    AttributionDataHostManager* attribution_data_host_manager,
+    AttributionManager* attribution_manager,
     PrivateAggregationManager* private_aggregation_manager,
     LogPrivateAggregationRequestsCallback
         log_private_aggregation_requests_callback,
@@ -126,7 +126,7 @@
           std::move(private_aggregation_requests_non_reserved)),
       fenced_frame_reporter_(FencedFrameReporter::CreateForFledge(
           url_loader_factory_,
-          attribution_data_host_manager,
+          attribution_manager,
           /*direct_seller_is_seller=*/
           !component_seller_winning_bid_info.has_value(),
           private_aggregation_manager_,
diff --git a/content/browser/interest_group/interest_group_auction_reporter.h b/content/browser/interest_group/interest_group_auction_reporter.h
index fdea50d..f768b83 100644
--- a/content/browser/interest_group/interest_group_auction_reporter.h
+++ b/content/browser/interest_group/interest_group_auction_reporter.h
@@ -41,7 +41,7 @@
 
 namespace content {
 
-class AttributionDataHostManager;
+class AttributionManager;
 class AuctionWorkletManager;
 class InterestGroupManagerImpl;
 class PrivateAggregationManager;
@@ -156,7 +156,7 @@
   // All passed in raw pointers, including those in *BidInfo fields must outlive
   // the created InterestGroupAuctionReporter.
   //
-  // `attribution_data_host_manager` is needed to create `FencedFrameReporter`
+  // `attribution_manager` is needed to create `FencedFrameReporter`
   // and could be null in Incognito mode or in test.
   //
   // `log_private_aggregation_requests_callback` will be passed all private
@@ -185,7 +185,7 @@
   InterestGroupAuctionReporter(
       InterestGroupManagerImpl* interest_group_manager,
       AuctionWorkletManager* auction_worklet_manager,
-      AttributionDataHostManager* attribution_data_host_manager,
+      AttributionManager* attribution_manager,
       PrivateAggregationManager* private_aggregation_manager,
       LogPrivateAggregationRequestsCallback
           log_private_aggregation_requests_callback,
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
index 5b205d1d..4e5d9872 100644
--- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -210,8 +210,7 @@
     interest_group_auction_reporter_ =
         std::make_unique<InterestGroupAuctionReporter>(
             interest_group_manager_impl_.get(), &auction_worklet_manager_,
-            /*attribution_data_host_manager=*/nullptr,
-            &private_aggregation_manager_,
+            /*attribution_manager=*/nullptr, &private_aggregation_manager_,
             private_aggregation_manager_
                 .GetLogPrivateAggregationRequestsCallback(),
             std::move(auction_config_), kTopFrameOrigin, kFrameOrigin,
diff --git a/content/browser/media/media_license_manager.cc b/content/browser/media/media_license_manager.cc
index e96635e0..a73b1c0 100644
--- a/content/browser/media/media_license_manager.cc
+++ b/content/browser/media/media_license_manager.cc
@@ -137,7 +137,7 @@
   DCHECK_GT(receivers_list.size(), 0u);
 
   storage::BucketLocator bucket_locator;
-  if (result.ok()) {
+  if (result.has_value()) {
     bucket_locator = result->ToBucketLocator();
   } else {
     // Use the null locator, but update the `storage_key` field so
diff --git a/content/browser/media/media_license_manager_unittest.cc b/content/browser/media/media_license_manager_unittest.cc
index 510d0559..ea1e7ac 100644
--- a/content/browser/media/media_license_manager_unittest.cc
+++ b/content/browser/media/media_license_manager_unittest.cc
@@ -76,7 +76,7 @@
         storage::BucketInitParams::ForDefaultBucket(storage_key),
         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/content/browser/renderer_host/dwrite_font_file_util_win.cc b/content/browser/renderer_host/dwrite_font_file_util_win.cc
index f423723..c32fd8a 100644
--- a/content/browser/renderer_host/dwrite_font_file_util_win.cc
+++ b/content/browser/renderer_host/dwrite_font_file_util_win.cc
@@ -140,11 +140,10 @@
 
 HRESULT AddFilesForFont(IDWriteFont* font,
                         const std::u16string& windows_fonts_path,
-                        std::set<std::wstring>* path_set,
-                        std::set<std::wstring>* custom_font_path_set,
-                        uint32_t* ttc_index) {
+                        std::set<std::wstring>* path_set) {
   std::wstring file_path;
-  HRESULT hr = FontFilePathAndTtcIndex(font, file_path, *ttc_index);
+  uint32_t dummy_ttc_index;
+  HRESULT hr = FontFilePathAndTtcIndex(font, file_path, dummy_ttc_index);
   if (FAILED(hr)) {
     return hr;
   }
@@ -158,7 +157,7 @@
   if (!base::StartsWith(file_path_folded, windows_fonts_path,
                         base::CompareCase::SENSITIVE)) {
     LogLoaderType(DirectWriteFontLoaderType::FILE_OUTSIDE_SANDBOX);
-    custom_font_path_set->insert(file_path);
+    path_set->insert(file_path);
   } else {
     LogLoaderType(DirectWriteFontLoaderType::FILE_SYSTEM_FONT_DIR);
     path_set->insert(file_path);
diff --git a/content/browser/renderer_host/dwrite_font_file_util_win.h b/content/browser/renderer_host/dwrite_font_file_util_win.h
index 5b439963..246b66d 100644
--- a/content/browser/renderer_host/dwrite_font_file_util_win.h
+++ b/content/browser/renderer_host/dwrite_font_file_util_win.h
@@ -29,9 +29,7 @@
                                 uint32_t& ttc_index);
 HRESULT AddFilesForFont(IDWriteFont* font,
                         const std::u16string& windows_fonts_path,
-                        std::set<std::wstring>* path_set,
-                        std::set<std::wstring>* custom_font_path_set,
-                        uint32_t* ttc_index);
+                        std::set<std::wstring>* path_set);
 
 std::u16string GetWindowsFontsPath();
 
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
index a42f326f..8afa8d9 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
@@ -216,29 +216,29 @@
   std::move(callback).Run(std::move(family_names));
 }
 
-void DWriteFontProxyImpl::GetFontFiles(uint32_t family_index,
-                                       GetFontFilesCallback callback) {
+void DWriteFontProxyImpl::GetFontFileHandles(
+    uint32_t family_index,
+    GetFontFileHandlesCallback callback) {
   InitializeDirectWrite();
   TRACE_EVENT0("dwrite,fonts", "FontProxyHost::OnGetFontFiles");
   callback = mojo::WrapCallbackWithDefaultInvokeIfNotRun(
-      std::move(callback), std::vector<base::FilePath>(),
-      std::vector<base::File>());
+      std::move(callback), std::vector<base::File>());
   if (!collection_)
     return;
 
   mswr::ComPtr<IDWriteFontFamily> family;
   HRESULT hr = collection_->GetFontFamily(family_index, &family);
   if (FAILED(hr)) {
-    if (IsLastResortFallbackFont(family_index))
+    if (IsLastResortFallbackFont(family_index)) {
       LogMessageFilterError(
           MessageFilterError::LAST_RESORT_FONT_GET_FAMILY_FAILED);
+    }
     return;
   }
 
   UINT32 font_count = family->GetFontCount();
 
   std::set<std::wstring> path_set;
-  std::set<std::wstring> custom_font_path_set;
   // Iterate through all the fonts in the family, and all the files for those
   // fonts. If anything goes wrong, bail on the entire family to avoid having
   // a partially-loaded font family.
@@ -246,47 +246,39 @@
     mswr::ComPtr<IDWriteFont> font;
     hr = family->GetFont(font_index, &font);
     if (FAILED(hr)) {
-      if (IsLastResortFallbackFont(family_index))
+      if (IsLastResortFallbackFont(family_index)) {
         LogMessageFilterError(
             MessageFilterError::LAST_RESORT_FONT_GET_FONT_FAILED);
+      }
       return;
     }
 
-    uint32_t dummy_ttc_index = 0;
-    if (FAILED(AddFilesForFont(font.Get(), windows_fonts_path_, &path_set,
-                               &custom_font_path_set, &dummy_ttc_index))) {
-      if (IsLastResortFallbackFont(family_index))
+    if (FAILED(AddFilesForFont(font.Get(), windows_fonts_path_, &path_set))) {
+      if (IsLastResortFallbackFont(family_index)) {
         LogMessageFilterError(
             MessageFilterError::LAST_RESORT_FONT_ADD_FILES_FAILED);
+      }
     }
   }
 
   std::vector<base::File> file_handles;
-  // For files outside the windows fonts directory we pass them to the renderer
-  // as file handles. The renderer would be unable to open the files directly
-  // due to sandbox policy (it would get ERROR_ACCESS_DENIED instead). Passing
-  // handles allows the renderer to bypass the restriction and use the fonts.
+  // We pass handles for every path as the sandbox blocks direct access to font
+  // files in the renderer.
   // TODO(jam): if kDWriteFontProxyOnIO is removed also remove the exception
   // for this class from thread_restrictions.h
   base::ScopedAllowBlocking allow_io;
-  for (const auto& custom_font_path : custom_font_path_set) {
+  for (const auto& font_path : path_set) {
     // Specify FLAG_WIN_EXCLUSIVE_WRITE to prevent base::File from opening the
     // file with FILE_SHARE_WRITE access. FLAG_WIN_EXCLUSIVE_WRITE doesn't
     // actually open the file for write access.
-    base::File file(base::FilePath(custom_font_path),
+    base::File file(base::FilePath(font_path),
                     base::File::FLAG_OPEN | base::File::FLAG_READ |
                         base::File::FLAG_WIN_EXCLUSIVE_WRITE);
     if (file.IsValid()) {
       file_handles.push_back(std::move(file));
     }
   }
-
-  std::vector<base::FilePath> file_paths;
-  for (const auto& path : path_set) {
-    file_paths.emplace_back(base::FilePath(path));
-  }
-  LogLastResortFontFileCount(file_paths.size());
-  std::move(callback).Run(file_paths, std::move(file_handles));
+  std::move(callback).Run(std::move(file_handles));
 }
 
 void DWriteFontProxyImpl::MapCharacters(
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win.h b/content/browser/renderer_host/dwrite_font_proxy_impl_win.h
index b01c7f1..92281ee 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_impl_win.h
+++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win.h
@@ -47,8 +47,8 @@
   void GetFamilyCount(GetFamilyCountCallback callback) override;
   void GetFamilyNames(uint32_t family_index,
                       GetFamilyNamesCallback callback) override;
-  void GetFontFiles(uint32_t family_index,
-                    GetFontFilesCallback callback) override;
+  void GetFontFileHandles(uint32_t family_index,
+                          GetFontFileHandlesCallback callback) override;
   void MapCharacters(const std::u16string& text,
                      blink::mojom::DWriteFontStylePtr font_style,
                      const std::u16string& locale_name,
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win_unittest.cc b/content/browser/renderer_host/dwrite_font_proxy_impl_win_unittest.cc
index e2475e0aa..152f7328 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_impl_win_unittest.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win_unittest.cc
@@ -91,27 +91,26 @@
   EXPECT_TRUE(names.empty());
 }
 
-TEST_F(DWriteFontProxyImplUnitTest, GetFontFiles) {
+TEST_F(DWriteFontProxyImplUnitTest, GetFontFileHandles) {
   UINT32 arial_index = 0;
   dwrite_font_proxy().FindFamily(u"Arial", &arial_index);
 
-  std::vector<base::FilePath> files;
   std::vector<base::File> handles;
-  dwrite_font_proxy().GetFontFiles(arial_index, &files, &handles);
+  dwrite_font_proxy().GetFontFileHandles(arial_index, &handles);
 
-  EXPECT_LT(0u, files.size());
-  for (const auto& file : files) {
-    EXPECT_FALSE(file.value().empty());
+  EXPECT_LT(0u, handles.size());
+  for (auto& file : handles) {
+    EXPECT_TRUE(file.IsValid());
+    EXPECT_LT(0, file.GetLength());  // Check the file exists
   }
 }
 
-TEST_F(DWriteFontProxyImplUnitTest, GetFontFilesIndexOutOfBounds) {
-  std::vector<base::FilePath> files;
+TEST_F(DWriteFontProxyImplUnitTest, GetFontFileHandlesIndexOutOfBounds) {
   std::vector<base::File> handles;
   UINT32 invalid_index = 1000000;
-  dwrite_font_proxy().GetFontFiles(invalid_index, &files, &handles);
+  dwrite_font_proxy().GetFontFileHandles(invalid_index, &handles);
 
-  EXPECT_EQ(0u, files.size());
+  EXPECT_EQ(0u, handles.size());
 }
 
 TEST_F(DWriteFontProxyImplUnitTest, MapCharacter) {
@@ -174,11 +173,9 @@
   UINT32 arial_index = 0;
   dwrite_font_proxy().FindFamily(u"Arial", &arial_index);
 
-  std::vector<base::FilePath> files;
   std::vector<base::File> handles;
-  dwrite_font_proxy().GetFontFiles(arial_index, &files, &handles);
+  dwrite_font_proxy().GetFontFileHandles(arial_index, &handles);
 
-  EXPECT_TRUE(files.empty());
   EXPECT_FALSE(handles.empty());
   for (auto& file : handles) {
     EXPECT_TRUE(file.IsValid());
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index a02a6e4..85de1611 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -456,9 +456,12 @@
 
     if (base::FeatureList::IsEnabled(
             blink::features::kAttributionReportingCrossAppWeb)) {
-      headers->SetHeader("Attribution-Reporting-Support",
-                         attribution_reporting::GetSupportHeader(
-                             AttributionManager::GetOsSupport()));
+      if (auto* attribution_manager =
+              AttributionManager::FromBrowserContext(browser_context)) {
+        headers->SetHeader("Attribution-Reporting-Support",
+                           attribution_reporting::GetSupportHeader(
+                               attribution_manager->GetOsSupport()));
+      }
     }
   }
 }
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 08e8f09..d714f76 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1730,6 +1730,13 @@
   CreateMessageFilters();
   RegisterMojoInterfaces();
 
+  auto attribution_os_support =
+      attribution_reporting::mojom::OsSupport::kDisabled;
+  if (auto* attribution_manager =
+          AttributionManager::FromBrowserContext(browser_context_)) {
+    attribution_os_support = attribution_manager->GetOsSupport();
+  }
+
   // Call this now and not in OnProcessLaunched in case any mojo calls get
   // dispatched before this.
   GetRendererInterface()->InitializeRenderer(
@@ -1739,7 +1746,7 @@
       GetContentClient()->browser()->GetReducedUserAgent(),
       GetContentClient()->browser()->GetUserAgentMetadata(),
       storage_partition_impl_->cors_exempt_header_list(),
-      AttributionManager::GetOsSupport());
+      attribution_os_support);
 
   if (run_renderer_in_process()) {
     DCHECK(g_renderer_main_thread_factory);
@@ -2071,7 +2078,8 @@
     mojo::PendingReceiver<blink::mojom::LockManager> receiver,
     storage::QuotaErrorOr<storage::BucketInfo> bucket) {
   storage_partition_impl_->GetLockManager()->BindReceiver(
-      bucket.ok() ? bucket->id : storage::BucketId(), std::move(receiver));
+      bucket.has_value() ? bucket->id : storage::BucketId(),
+      std::move(receiver));
 }
 
 void RenderProcessHostImpl::CreatePermissionService(
@@ -5405,11 +5413,6 @@
           std::move(allocator)));
 }
 
-void RenderProcessHostImpl::SetOsSupportForAttributionReporting(
-    attribution_reporting::mojom::OsSupport os_support) {
-  GetRendererInterface()->SetOsSupportForAttributionReporting(os_support);
-}
-
 #if BUILDFLAG(IS_ANDROID)
 void RenderProcessHostImpl::NotifyMemoryPressureToRenderer(
     base::MemoryPressureListener::MemoryPressureLevel level) {
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index c85cbba0..066a251 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -324,9 +324,6 @@
   void ResumeSocketManagerForRenderFrameHost(
       const GlobalRenderFrameHostId& render_frame_host_id) override;
 
-  void SetOsSupportForAttributionReporting(
-      attribution_reporting::mojom::OsSupport os_support) override;
-
   // IPC::Sender via RenderProcessHost.
   bool Send(IPC::Message* msg) override;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index bfc2ab4d..47d2352 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -414,6 +414,16 @@
   } else if (pending_screen_state_.has_unlocked_orientation_lock &&
              rwhva_->in_rotation_) {
     end_rotation = true;
+  } else if (!pending_screen_state_.is_fullscreen &&
+             current_screen_state_.is_fullscreen) {
+    // PWA and WebView may be created as Fullscreen, without marking the
+    // WebContents as Fullscreen. In this state the Renderer can still request
+    // to toggle Fullscreen, which enables the ScreenOrientation APIs. However
+    // there will be no layout changes occuring.
+    //
+    // To account for this trigger a sync now to release the JavaScript Promise,
+    // and to update our `current_screen_state_`.
+    sync_needed = true;
   } else {
     bool physical_backing_rotation = false;
     bool screen_info_rotation = false;
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 1c3f126..ff46800c 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -451,6 +451,8 @@
     void WasShownAfterEviction();
 
    private:
+    friend class RenderWidgetHostViewAndroidRotationTest;
+
     // Sets the `current_screen_state_` to be the current values. Clears
     // `pending_screen_state_` to begin tracking subsequent updates.
     void BeginScreenStateChange();
diff --git a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
index b597b9a..62cf2b7 100644
--- a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
@@ -433,6 +433,8 @@
 
   // Fires the rotation throttle timeout.
   void FireRotationTimeout();
+  // Firet the fullscreen throttle timeout.
+  void FireFullscreenTimeout();
 
   // RenderWidgetHostViewAndroid:
   void EnterFullscreenMode();
@@ -551,6 +553,11 @@
   render_widget_host_view_android()->rotation_timeout_.FireNow();
 }
 
+void RenderWidgetHostViewAndroidRotationTest::FireFullscreenTimeout() {
+  render_widget_host_view_android()
+      ->screen_state_change_handler_.throttle_timeout_.FireNow();
+}
+
 void RenderWidgetHostViewAndroidRotationTest::EnterFullscreenMode() {
   blink::mojom::FullscreenOptions options;
   render_widget_host_view_android()->EnterFullscreenMode(options);
@@ -1005,6 +1012,37 @@
   EXPECT_TRUE(rwhva->CanSynchronizeVisualProperties());
 }
 
+// Tests that when toggling FullscreenMode, where no layout changes occur, that
+// we unthrottle and advance the viz::LocalSurfaceId after each step.
+TEST_F(RenderWidgetHostViewAndroidRotationTest, ToggleFullscreenWithoutResize) {
+  RenderWidgetHostViewAndroid* rwhva = render_widget_host_view_android();
+  auto local_surface_id = rwhva->GetLocalSurfaceId();
+  EnterFullscreenMode();
+  EXPECT_FALSE(rwhva->CanSynchronizeVisualProperties());
+
+  // When there has been no resize triggered the timeout can fire. It should
+  // clear throttling and advance the viz::LocalSurfaceId;
+  FireFullscreenTimeout();
+  EXPECT_TRUE(rwhva->CanSynchronizeVisualProperties());
+  auto post_timeout_local_surface_id =
+      GetLocalSurfaceIdAndConfirmNewerThan(local_surface_id);
+
+  ExitFullscreenMode();
+  EXPECT_TRUE(rwhva->CanSynchronizeVisualProperties());
+  auto post_fullscreen_local_surface_id =
+      GetLocalSurfaceIdAndConfirmNewerThan(post_timeout_local_surface_id);
+
+  // When we re-enter fullscreen we should throttle again.
+  EnterFullscreenMode();
+  EXPECT_FALSE(rwhva->CanSynchronizeVisualProperties());
+
+  // The timeout should once again unthrottle and advance the
+  // viz::LocalSurfaceId.
+  FireFullscreenTimeout();
+  EXPECT_TRUE(rwhva->CanSynchronizeVisualProperties());
+  GetLocalSurfaceIdAndConfirmNewerThan(post_fullscreen_local_surface_id);
+}
+
 // Tests rotation and fullscreen cases that are supported by both the visual
 // properties analysis, and the fullscreen killswitch legacy path.
 //
diff --git a/content/browser/resources/aggregation_service/BUILD.gn b/content/browser/resources/aggregation_service/BUILD.gn
index fe736999..f4e3e18 100644
--- a/content/browser/resources/aggregation_service/BUILD.gn
+++ b/content/browser/resources/aggregation_service/BUILD.gn
@@ -22,7 +22,7 @@
   ts_use_local_config = false
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   aggregation_service_content_folder = "content/browser/aggregation_service"
diff --git a/content/browser/resources/attribution_reporting/BUILD.gn b/content/browser/resources/attribution_reporting/BUILD.gn
index 3ae2858..6ce7b5f 100644
--- a/content/browser/resources/attribution_reporting/BUILD.gn
+++ b/content/browser/resources/attribution_reporting/BUILD.gn
@@ -22,7 +22,7 @@
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   ts_use_local_config = false
diff --git a/content/browser/resources/indexed_db/BUILD.gn b/content/browser/resources/indexed_db/BUILD.gn
index ec1e50b5..65dc921 100644
--- a/content/browser/resources/indexed_db/BUILD.gn
+++ b/content/browser/resources/indexed_db/BUILD.gn
@@ -15,7 +15,7 @@
 
   ts_deps = [
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   indexeddb_internal_folder = "content/browser/indexed_db"
diff --git a/content/browser/resources/process/BUILD.gn b/content/browser/resources/process/BUILD.gn
index 77add9b..940bd88 100644
--- a/content/browser/resources/process/BUILD.gn
+++ b/content/browser/resources/process/BUILD.gn
@@ -25,7 +25,7 @@
   deps = [
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   extra_deps = [ ":copy_files" ]
 }
diff --git a/content/browser/resources/quota/BUILD.gn b/content/browser/resources/quota/BUILD.gn
index 8c85ffd2..c7b1b4d2 100644
--- a/content/browser/resources/quota/BUILD.gn
+++ b/content/browser/resources/quota/BUILD.gn
@@ -23,7 +23,7 @@
 
   ts_deps = [
     "//ui/webui/resources/cr_elements:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   grit_output_dir = "$root_gen_dir/content"
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index e7f68b58..51612234 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -223,7 +223,7 @@
     NewRegistrationCallback callback,
     storage::QuotaErrorOr<storage::BucketInfo> result) {
   // Return nullptr if `UpdateOrCreateBucket` fails.
-  if (!result.ok()) {
+  if (!result.has_value()) {
     std::move(callback).Run(nullptr);
     return;
   }
diff --git a/content/browser/service_worker/service_worker_registry_unittest.cc b/content/browser/service_worker/service_worker_registry_unittest.cc
index 83dd5258..1d550dde 100644
--- a/content/browser/service_worker/service_worker_registry_unittest.cc
+++ b/content/browser/service_worker/service_worker_registry_unittest.cc
@@ -685,7 +685,7 @@
   storage::QuotaErrorOr<storage::BucketInfo> result =
       quota_manager_proxy_sync.GetBucket(kKey, storage::kDefaultBucketName,
                                          blink::mojom::StorageType::kTemporary);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key, kKey);
   EXPECT_GT(result->id.value(), 0);
@@ -2125,7 +2125,7 @@
         quota_manager_proxy_sync.GetBucket(
             kKey, storage::kDefaultBucketName,
             blink::mojom::StorageType::kTemporary);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     EXPECT_EQ(result->name, storage::kDefaultBucketName);
     EXPECT_EQ(result->storage_key, kKey);
     EXPECT_GT(result->id.value(), 0);
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc
index 32a23fa..45373142 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -10,7 +10,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "components/services/storage/shared_storage/public/mojom/shared_storage.mojom.h"
 #include "components/services/storage/shared_storage/shared_storage_manager.h"
-#include "content/browser/attribution_reporting/attribution_data_host_manager.h"
+#include "content/browser/attribution_reporting/attribution_manager.h"
 #include "content/browser/devtools/devtools_instrumentation.h"
 #include "content/browser/fenced_frame/fenced_frame_reporter.h"
 #include "content/browser/private_aggregation/private_aggregation_budget_key.h"
@@ -73,7 +73,7 @@
   if (!urls_with_metadata[index]->reporting_metadata.empty()) {
     fenced_frame_reporter = FencedFrameReporter::CreateForSharedStorage(
         storage_partition->GetURLLoaderFactoryForBrowserProcess(),
-        AttributionDataHostManager::FromBrowserContext(browser_context),
+        AttributionManager::FromBrowserContext(browser_context),
         urls_with_metadata[index]->reporting_metadata);
   }
   return SharedStorageURNMappingResult(
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index c0a0fa8..3769320 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -2668,7 +2668,7 @@
   DCHECK(initialized_);
   DCHECK(callback);
 
-  if (!buckets.ok() || buckets->empty()) {
+  if (!buckets.has_value() || buckets->empty()) {
     std::move(callback).Run();
     return;
   }
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 05e603e5..256bdc7 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -4069,6 +4069,84 @@
   EXPECT_TRUE(test_delegate.fullscreen_options().prefers_navigation_bar);
 }
 
+// Tests that when toggling EnterFullscreen/ExitFullscreen that each state
+// properly synchronizes with the Renderer, fulfilling the Promises. Even when
+// there has been no layout changes, such as when the Renderer is already
+// embedded in a fullscreen context, with no OS nor Browser control insets.
+//
+// Also confirms that each state change does not block the subsequent one.
+// Finally on Android, which supports full browser ScreenOrientation locks, that
+// we can successfully apply the lock.
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest, ToggleFullscreen) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+
+  TestWCDelegateForDialogsAndFullscreen test_delegate(web_contents);
+
+  GURL url = embedded_test_server()->GetURL("a.com", "/page_with_iframe.html");
+  EXPECT_TRUE(NavigateToURL(web_contents, url));
+  RenderFrameHostImpl* main_frame = web_contents->GetPrimaryMainFrame();
+
+  EXPECT_FALSE(IsInFullscreen());
+
+  // Make the top page fullscreen with system navigation ui.
+  {
+    test_delegate.WillWaitForFullscreenEnter();
+    TitleWatcher title_watcher(web_contents, u"main_fullscreen_fulfilled");
+    EXPECT_TRUE(ExecJs(
+        main_frame,
+        "document.body.requestFullscreen({ navigationUI: 'show' }).then(() => "
+        "{document.title = 'main_fullscreen_fulfilled'});"));
+    test_delegate.Wait();
+
+    std::u16string title = title_watcher.WaitAndGetTitle();
+    ASSERT_EQ(title, u"main_fullscreen_fulfilled");
+  }
+  EXPECT_TRUE(IsInFullscreen());
+
+  // Full document orientation lock is only available on Android.
+#if BUILDFLAG(IS_ANDROID)
+  {
+    TitleWatcher title_watcher(web_contents, u"portrait_lock_fulfilled");
+    EXPECT_TRUE(ExecJs(main_frame,
+                       "screen.orientation.lock('portrait').then(() => "
+                       "{document.title = 'portrait_lock_fulfilled'});"));
+    std::u16string title = title_watcher.WaitAndGetTitle();
+    ASSERT_EQ(title, u"portrait_lock_fulfilled");
+  }
+#endif
+
+  // Exiting fullscreen should update the title. This should not block
+  // subsequent request to re-enter fullscreen.
+  {
+    test_delegate.WillWaitForFullscreenExit();
+    TitleWatcher title_watcher(web_contents, u"main_exit_fullscreen_fulfilled");
+    EXPECT_TRUE(
+        ExecJs(main_frame,
+               "document.exitFullscreen().then(() => "
+               "{document.title = 'main_exit_fullscreen_fulfilled'});"));
+    test_delegate.Wait();
+
+    std::u16string title = title_watcher.WaitAndGetTitle();
+    ASSERT_EQ(title, u"main_exit_fullscreen_fulfilled");
+  }
+
+  // Make the top page fullscreen with system navigation ui.
+  {
+    test_delegate.WillWaitForFullscreenEnter();
+    TitleWatcher title_watcher(web_contents, u"main_fullscreen_fulfilled");
+    EXPECT_TRUE(ExecJs(
+        main_frame,
+        "document.body.requestFullscreen({ navigationUI: 'show' }).then(() => "
+        "{document.title = 'main_fullscreen_fulfilled'});"));
+    test_delegate.Wait();
+
+    std::u16string title = title_watcher.WaitAndGetTitle();
+    ASSERT_EQ(title, u"main_fullscreen_fulfilled");
+  }
+}
+
 class MockDidOpenRequestedURLObserver : public WebContentsObserver {
  public:
   explicit MockDidOpenRequestedURLObserver(Shell* shell)
diff --git a/content/browser/web_database/web_database_host_impl.cc b/content/browser/web_database/web_database_host_impl.cc
index 991c8f1..62a6212b 100644
--- a/content/browser/web_database/web_database_host_impl.cc
+++ b/content/browser/web_database/web_database_host_impl.cc
@@ -150,7 +150,7 @@
     OpenFileCallback callback,
     storage::QuotaErrorOr<storage::BucketInfo> bucket) {
   // Return invalid file path on `UpdateOrCreateBucket` error.
-  if (!bucket.ok()) {
+  if (!bucket.has_value()) {
     std::move(callback).Run(base::File());
     return;
   }
diff --git a/content/browser/web_database/web_database_host_impl_unittest.cc b/content/browser/web_database/web_database_host_impl_unittest.cc
index a608676..ef3d652b5 100644
--- a/content/browser/web_database/web_database_host_impl_unittest.cc
+++ b/content/browser/web_database/web_database_host_impl_unittest.cc
@@ -197,7 +197,7 @@
       quota_manager_proxy_sync.GetBucket(
           blink::StorageKey::CreateFromStringForTesting(example_url),
           storage::kDefaultBucketName, blink::mojom::StorageType::kTemporary);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->name, storage::kDefaultBucketName);
   EXPECT_EQ(result->storage_key,
             blink::StorageKey::CreateFromStringForTesting(example_url));
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc
index 4f13560..d89e7ec 100644
--- a/content/browser/webui/shared_resources_data_source.cc
+++ b/content/browser/webui/shared_resources_data_source.cc
@@ -77,7 +77,7 @@
 
   // Note: Don't put generated Mojo bindings here. Mojo bindings should be
   // included in the either the ts_library() target for the UI using them (if
-  // they are only used by one UI) or in //ui/webui/resources/mojo:library
+  // they are only used by one UI) or in //ui/webui/resources/mojo:build_ts
   // (if used by multiple UIs).
   source->AddResourcePaths(
       base::make_span(kWebuiResources, kWebuiResourcesSize));
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 85f6c61e..3637a42c 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -382,7 +382,6 @@
   const uint32_t* family_index =
       reinterpret_cast<const uint32_t*>(collection_key);
 
-  std::vector<base::FilePath> file_names;
   std::vector<base::File> file_handles;
   {
     // The Mojo call cannot be asynchronous because CreateEnumeratorFromKey is
@@ -391,30 +390,22 @@
     // (CreateEnumeratorFromKey can be invoked from the main thread or the
     // ThreadPool).
     base::ScopedAllowBaseSyncPrimitives allow_sync;
-    if (!GetFontProxy().GetFontFiles(*family_index, &file_names,
-                                     &file_handles)) {
+    if (!GetFontProxy().GetFontFileHandles(*family_index, &file_handles)) {
       LogFontProxyError(GET_FONT_FILES_SEND_FAILED);
       return E_FAIL;
     }
   }
 
   std::vector<HANDLE> handles;
-  handles.reserve(file_names.size() + file_handles.size());
-  for (const base::FilePath& file_name : file_names) {
-    // This leaks the handles, since they are used as the reference key to
-    // CreateStreamFromKey, and DirectWrite requires the reference keys to
-    // remain valid for the lifetime of the loader. The loader is the font
-    // collection proxy, which remains alive for the lifetime of the renderer.
-    HANDLE handle =
-        CreateFile(file_name.value().c_str(), GENERIC_READ, FILE_SHARE_READ,
-                   NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-    if (handle != INVALID_HANDLE_VALUE)
-      handles.push_back(handle);
-  }
+  handles.reserve(file_handles.size());
   for (auto& file_handle : file_handles) {
     handles.push_back(file_handle.TakePlatformFile());
   }
 
+  // This leaks the handles, since they are used as the reference key to
+  // CreateStreamFromKey, and DirectWrite requires the reference keys to
+  // remain valid for the lifetime of the loader. The loader is the font
+  // collection proxy, which remains alive for the lifetime of the renderer.
   HRESULT hr = mswr::MakeAndInitialize<FontFileEnumerator>(
       font_file_enumerator, factory, this, &handles);
 
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
index f539d3e..163d1ec 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win_unittest.cc
@@ -305,7 +305,7 @@
   UINT32 font_count = family->GetFontCount();
   EXPECT_LT(0u, font_count);
   EXPECT_EQ(3u, fake_collection_->MessageCount());
-  EXPECT_EQ(FakeFontCollection::MessageType::kGetFontFiles,
+  EXPECT_EQ(FakeFontCollection::MessageType::kGetFontFileHandles,
             fake_collection_->GetMessageType(2));
   mswr::ComPtr<IDWriteFont> font;
   hr = family->GetFirstMatchingFont(DWRITE_FONT_WEIGHT_NORMAL,
diff --git a/content/common/renderer.mojom b/content/common/renderer.mojom
index 48eab92..ba8a4e1 100644
--- a/content/common/renderer.mojom
+++ b/content/common/renderer.mojom
@@ -162,11 +162,6 @@
   // TODO(crbug.com/1206150): We need a specification for this restriction.
   SetIsIsolatedContext(bool value);
 
-  // Set the OS-level support for Attribution Reporting indicating whether
-  // OS-level attribution is enabled.
-  SetOsSupportForAttributionReporting(
-      attribution_reporting.mojom.OsSupport os_support);
-
   // Initialize renderer user agent string, user agent metadata and CORS exempt
   // header list on renderer startup.
   //
diff --git a/content/public/android/java/src/org/chromium/content/browser/BindingManager.java b/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
index ac6d0d0c..adf3735 100644
--- a/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/BindingManager.java
@@ -14,8 +14,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.process_launcher.ChildProcessConnection;
-import org.chromium.content_public.browser.ContentFeatureList;
-import org.chromium.content_public.common.ContentFeatures;
 
 import java.util.Iterator;
 import java.util.Set;
@@ -184,17 +182,19 @@
                 && isExclusiveVisibleBinding(connection);
     }
 
+    /**
+     * Override the default behavior which is based on Android version. This can be removed once
+     * Android P support ends.
+     */
     @VisibleForTesting
-    static void resetUseNotPerceptibleBindingForTesting() {
-        sUseNotPerceptibleBinding = null;
+    static void setUseNotPerceptibleBindingForTesting(boolean useNotPerceptibleBinding) {
+        sUseNotPerceptibleBinding = useNotPerceptibleBinding;
     }
 
     @VisibleForTesting
     static boolean useNotPerceptibleBinding() {
         if (sUseNotPerceptibleBinding == null) {
-            sUseNotPerceptibleBinding = ChildProcessConnection.supportNotPerceptibleBinding()
-                    && ContentFeatureList.isEnabled(
-                            ContentFeatures.BINDING_MANAGER_USE_NOT_PERCEPTIBLE_BINDING);
+            sUseNotPerceptibleBinding = ChildProcessConnection.supportNotPerceptibleBinding();
         }
         return sUseNotPerceptibleBinding;
     }
diff --git a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
index 3777c17..409a207 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
@@ -29,13 +29,10 @@
 import org.chromium.base.process_launcher.TestChildProcessConnection;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Feature;
-import org.chromium.content_public.common.ContentFeatures;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Unit tests for BindingManager and ChildProcessConnection.
@@ -47,13 +44,6 @@
 @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.Q)
 @LooperMode(LooperMode.Mode.LEGACY)
 public class BindingManagerTest {
-    private static final Map<String, Boolean> DISABLE_NOT_PERCEPTIBLE_BINDING = new HashMap<>() {
-        { put(ContentFeatures.BINDING_MANAGER_USE_NOT_PERCEPTIBLE_BINDING, false); }
-    };
-    private static final Map<String, Boolean> ENABLE_NOT_PERCEPTIBLE_BINDING = new HashMap<>() {
-        { put(ContentFeatures.BINDING_MANAGER_USE_NOT_PERCEPTIBLE_BINDING, true); }
-    };
-
     private static final int BINDING_COUNT_LIMIT = 5;
 
     // Creates a mocked ChildProcessConnection that is optionally added to a BindingManager.
@@ -99,14 +89,13 @@
     }
 
     private void setupBindingType(boolean useNotPerceptibleBinding) {
-        BindingManager.resetUseNotPerceptibleBindingForTesting();
+        boolean isQOrHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
+        BindingManager.setUseNotPerceptibleBindingForTesting(
+                useNotPerceptibleBinding && isQOrHigher);
         if (useNotPerceptibleBinding) {
-            FeatureList.setTestFeatures(ENABLE_NOT_PERCEPTIBLE_BINDING);
-            boolean isQOrHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
             Assert.assertEquals(isQOrHigher, BindingManager.useNotPerceptibleBinding());
             return;
         }
-        FeatureList.setTestFeatures(DISABLE_NOT_PERCEPTIBLE_BINDING);
         Assert.assertFalse(BindingManager.useNotPerceptibleBinding());
     }
 
diff --git a/content/public/android/junit/src/org/chromium/content/browser/ChildProcessConnectionMetricsUnitTest.java b/content/public/android/junit/src/org/chromium/content/browser/ChildProcessConnectionMetricsUnitTest.java
index 04d0ced..fb4987b1 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/ChildProcessConnectionMetricsUnitTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/ChildProcessConnectionMetricsUnitTest.java
@@ -24,11 +24,8 @@
 import org.chromium.base.process_launcher.ChildProcessConnection;
 import org.chromium.base.process_launcher.TestChildProcessConnection;
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.content_public.common.ContentFeatures;
 
-import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.Map;
 
 /**
  * Unit test for {@link ChildProcessConnectionMetrics}.
@@ -36,13 +33,6 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.Q)
 public class ChildProcessConnectionMetricsUnitTest {
-    private static final Map<String, Boolean> DISABLE_NOT_PERCEPTIBLE_BINDING = new HashMap<>() {
-        { put(ContentFeatures.BINDING_MANAGER_USE_NOT_PERCEPTIBLE_BINDING, false); }
-    };
-    private static final Map<String, Boolean> ENABLE_NOT_PERCEPTIBLE_BINDING = new HashMap<>() {
-        { put(ContentFeatures.BINDING_MANAGER_USE_NOT_PERCEPTIBLE_BINDING, true); }
-    };
-
     private LinkedList<ChildProcessConnection> mRanking;
     private BindingManager mBindingManager;
     private ChildProcessConnectionMetrics mConnectionMetrics;
@@ -461,13 +451,11 @@
     }
 
     private void setupBindingType(boolean useNotPerceptibleBinding) {
-        BindingManager.resetUseNotPerceptibleBindingForTesting();
+        BindingManager.setUseNotPerceptibleBindingForTesting(useNotPerceptibleBinding);
         if (useNotPerceptibleBinding) {
-            FeatureList.setTestFeatures(ENABLE_NOT_PERCEPTIBLE_BINDING);
             Assert.assertTrue(BindingManager.useNotPerceptibleBinding());
             return;
         }
-        FeatureList.setTestFeatures(DISABLE_NOT_PERCEPTIBLE_BINDING);
         Assert.assertFalse(BindingManager.useNotPerceptibleBinding());
     }
 }
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h
index 5661f05..3c531a1 100644
--- a/content/public/browser/render_process_host.h
+++ b/content/public/browser/render_process_host.h
@@ -19,7 +19,6 @@
 #include "base/supports_user_data.h"
 #include "base/tracing/protos/chrome_track_event.pbzero.h"
 #include "build/build_config.h"
-#include "components/attribution_reporting/os_support.mojom-forward.h"
 #include "content/common/content_export.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sender.h"
@@ -685,12 +684,6 @@
                                    base::ScopedFD log_file_descriptor) = 0;
 #endif
 
-  // Sets whether OS-level support is enabled for Attribution Reporting API.
-  // See
-  // https://github.com/WICG/attribution-reporting-api/blob/main/app_to_web.md.
-  virtual void SetOsSupportForAttributionReporting(
-      attribution_reporting::mojom::OsSupport os_support) = 0;
-
   // Static management functions -----------------------------------------------
 
   // Possibly start an unbound, spare RenderProcessHost. A subsequent creation
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 51ddb53..668c7a0 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -1451,12 +1451,6 @@
              "BindingManagerConnectionLimit",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// When this feature is enabled the BindingManager for non-low-end devices will
-// use a not perceptible binding for background renderers on Android Q+.
-BASE_FEATURE(kBindingManagerUseNotPerceptibleBinding,
-             "BindingManagerUseNotPerceptibleBinding",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Reduce the priority of GPU process when in background so it is more likely
 // to be killed first if the OS needs more memory.
 BASE_FEATURE(kReduceGpuPriorityOnBackground,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 4a4525e..78edafbf 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -317,7 +317,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kAutoDisableAccessibilityV2);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kBackgroundMediaRendererHasModerateBinding);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kBindingManagerConnectionLimit);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kBindingManagerUseNotPerceptibleBinding);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kReduceGpuPriorityOnBackground);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kOnDemandAccessibilityEvents);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kRequestDesktopSiteAdditions);
diff --git a/content/public/test/mock_render_process_host.h b/content/public/test/mock_render_process_host.h
index 968ddee..0855288 100644
--- a/content/public/test/mock_render_process_host.h
+++ b/content/public/test/mock_render_process_host.h
@@ -23,7 +23,6 @@
 #include "base/observer_list.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "components/attribution_reporting/os_support.mojom.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_factory.h"
@@ -284,8 +283,6 @@
 
   std::string GetInfoForBrowserContextDestructionCrashReporting() override;
   void WriteIntoTrace(perfetto::TracedProto<TraceProto> proto) const override;
-  void SetOsSupportForAttributionReporting(
-      attribution_reporting::mojom::OsSupport os_support) override {}
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   void ReinitializeLogging(uint32_t logging_dest,
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index b240a5e..c376fda 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -1847,11 +1847,6 @@
   return attribution_os_support_;
 }
 
-void RenderThreadImpl::SetOsSupportForAttributionReporting(
-    attribution_reporting::mojom::OsSupport attribution_os_support) {
-  attribution_os_support_ = attribution_os_support;
-}
-
 std::unique_ptr<CodecFactory> RenderThreadImpl::CreateMediaCodecFactory(
     scoped_refptr<viz::ContextProviderCommandBuffer> context_provider,
     bool enable_video_decode_accelerator,
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index d98e688..32600c0e 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -446,8 +446,6 @@
 #endif
   void SetIsCrossOriginIsolated(bool value) override;
   void SetIsIsolatedContext(bool value) override;
-  void SetOsSupportForAttributionReporting(
-      attribution_reporting::mojom::OsSupport os_support) override;
   void OnMemoryPressure(
       base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 1d4e764..00c9e1c 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1066,7 +1066,7 @@
     "web_ui_ts_test.test-mojom-webui.ts",
     "web_ui_ts_test_types.test-mojom-webui.ts",
   ]
-  deps = [ "//ui/webui/resources/mojo:library" ]
+  deps = [ "//ui/webui/resources/mojo:build_ts" ]
   extra_deps = [
     ":preprocess_mojo_webui_test",
     ":web_ui_ts_test_mojo_bindings_ts__generator",
diff --git a/content/test/data/accessibility/html/popover-api.html b/content/test/data/accessibility/html/popover-api.html
index d3db5ba..2ea39ff 100644
--- a/content/test/data/accessibility/html/popover-api.html
+++ b/content/test/data/accessibility/html/popover-api.html
@@ -7,32 +7,32 @@
 <ul popover role=listbox><li>Listbox role on ul</li></ul>
 <details popover><summary>summary/details popover</summary></details>
 
-<button popovertoggletarget=popover1>Button pointing to hidden popover</button>
-<input type=text popovertoggletarget=popover1>Text input pointing to hidden popover</button>
+<button popovertarget=popover1>Button pointing to hidden popover</button>
+<input type=text popovertarget=popover1>Text input pointing to hidden popover</button>
 <div popover id=popover1>Popover</div>
-<button popoverhidetarget=manual1>Hide button pointing to hidden manual</button>
-<input type=email popoverhidetarget=manual1>Email input pointing to hidden manual</button>
+<button popovertarget=manual1 popovertargetaction=hide>Hide button pointing to hidden manual</button>
+<input type=email popovertarget=manual1 popovertargetaction=hide>Email input pointing to hidden manual</button>
 <div popover=manual id=manual1>Manual</div>
 
-<button popovertoggletarget=noattr>Button pointing to non-popover</button>
-<input type=text popovertoggletarget=noattr>Text input pointing to non-popover</button>
+<button popovertarget=noattr>Button pointing to non-popover</button>
+<input type=text popovertarget=noattr>Text input pointing to non-popover</button>
 <div id=noattr>No popover attribute</div>
-<button popovertoggletarget=badattr>Button pointing to invalid popover value</button>
-<input type=text popovertoggletarget=badattr>Text input pointing to invalid popover value</button>
+<button popovertarget=badattr>Button pointing to invalid popover value</button>
+<input type=text popovertarget=badattr>Text input pointing to invalid popover value</button>
 <div id=badattr popover=invalid_value>Invalid popover attribute value</div>
 
 <p> Showing/visible popovers below </p>
 
-<button popovertoggletarget=popover2>Button pointing to showing popover</button>
-<input type=tel popovertoggletarget=popover2>Tel input pointing to showing popover</button>
-<button popovershowtarget=popover3>Show button pointing to nested popover</button>
-<input type=url popovershowtarget=popover3>Url input pointing to nested popover</button>
+<button popovertarget=popover2>Button pointing to showing popover</button>
+<input type=tel popovertarget=popover2>Tel input pointing to showing popover</button>
+<button popovertarget=popover3 popovertargetaction=show>Show button pointing to nested popover</button>
+<input type=url popovertarget=popover3 popovertargetaction=show>Url input pointing to nested popover</button>
 <div popover id=popover2>Popover (showing)
   <div popover id=popover3>Nested popover (showing)</div>
 </div>
-<button popoverhidetarget=manual2>Hide button pointing to showing manual (should add aria-details)</button>
-<input type=url popoverhidetarget=manual2>Url input pointing to showing manual</button>
-<button popoverhidetarget=manual2>Hide button pointing to showing manual (should NOT add aria-details)</button>
+<button popovertarget=manual2 popovertargetaction=hide>Hide button pointing to showing manual (should add aria-details)</button>
+<input type=url popovertarget=manual2 popovertargetaction=hide>Url input pointing to showing manual</button>
+<button popovertarget=manual2 popovertargetaction=hide>Hide button pointing to showing manual (should NOT add aria-details)</button>
 <div popover=manual id=manual2>Manual (showing)</div>
 <script>
   popover2.showPopover();
diff --git a/content/test/dwrite_font_fake_sender_win.cc b/content/test/dwrite_font_fake_sender_win.cc
index efc265e..3d1b5f5 100644
--- a/content/test/dwrite_font_fake_sender_win.cc
+++ b/content/test/dwrite_font_fake_sender_win.cc
@@ -108,17 +108,24 @@
   std::move(callback).Run(std::move(family_names));
 }
 
-void FakeFontCollection::GetFontFiles(uint32_t family_index,
-                                      GetFontFilesCallback callback) {
-  message_types_.push_back(MessageType::kGetFontFiles);
-  std::vector<base::FilePath> file_paths;
+void FakeFontCollection::GetFontFileHandles(
+    uint32_t family_index,
+    GetFontFileHandlesCallback callback) {
+  message_types_.push_back(MessageType::kGetFontFileHandles);
   std::vector<base::File> file_handles;
   if (family_index < fonts_.size()) {
-    file_paths = fonts_[family_index].file_paths_;
+    for (const auto& font_path : fonts_[family_index].file_paths_) {
+      base::File file(base::FilePath(font_path),
+                      base::File::FLAG_OPEN | base::File::FLAG_READ |
+                          base::File::FLAG_WIN_EXCLUSIVE_WRITE);
+      if (file.IsValid()) {
+        file_handles.emplace_back(std::move(file));
+      }
+    }
     for (auto& file : fonts_[family_index].file_handles_)
       file_handles.emplace_back(file.Duplicate());
   }
-  std::move(callback).Run(file_paths, std::move(file_handles));
+  std::move(callback).Run(std::move(file_handles));
 }
 
 void FakeFontCollection::MapCharacters(
diff --git a/content/test/dwrite_font_fake_sender_win.h b/content/test/dwrite_font_fake_sender_win.h
index 5f6d277..3906ff4 100644
--- a/content/test/dwrite_font_fake_sender_win.h
+++ b/content/test/dwrite_font_fake_sender_win.h
@@ -91,7 +91,7 @@
     kFindFamily,
     kGetFamilyCount,
     kGetFamilyNames,
-    kGetFontFiles,
+    kGetFontFileHandles,
     kMapCharacters
   };
   FakeFontCollection();
@@ -115,8 +115,8 @@
   void GetFamilyCount(GetFamilyCountCallback callback) override;
   void GetFamilyNames(uint32_t family_index,
                       GetFamilyNamesCallback callback) override;
-  void GetFontFiles(uint32_t family_index,
-                    GetFontFilesCallback callback) override;
+  void GetFontFileHandles(uint32_t family_index,
+                          GetFontFileHandlesCallback callback) override;
   void MapCharacters(const std::u16string& text,
                      blink::mojom::DWriteFontStylePtr font_style,
                      const std::u16string& locale_name,
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 1229fee..acf1f83c 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -615,7 +615,7 @@
 ## Pixel 4 ##
 
 # Failing test when experiment DrDc is enabled via fieldtrial_testing_config.json.
-crbug.com/1289303 [ android-pixel-4 android-r angle-disabled no-passthrough ] conformance/textures/misc/texture-video-transparent.html [ Failure ]
+crbug.com/1289303 [ android-pixel-4 android-r ] conformance/textures/misc/texture-video-transparent.html [ Failure ] # finder:disable-narrowing
 
 crbug.com/1175232 [ android android-pixel-4 angle-opengles passthrough ] conformance2/reading/read-pixels-from-fbo-test.html [ Failure ]
 crbug.com/angleproject/3684 [ android angle-opengles ] conformance2/renderbuffers/multisample-with-full-sample-counts.html [ Failure ]
@@ -637,6 +637,8 @@
 crbug.com/1382796 [ android android-pixel-4 angle-opengles passthrough ] conformance2/textures/video/* [ RetryOnFailure ]
 # finder:group-end
 
+crbug.com/1419019 [ android android-pixel-4 no-passthrough ] conformance2/transform_feedback/too-small-buffers.html [ RetryOnFailure ]
+
 #####################
 # ChromeOS failures #
 #####################
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index ffa3d3b..338b52b0 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -543,6 +543,12 @@
 crbug.com/1288603 [ android android-pixel-6 passthrough angle-opengles ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ]
 crbug.com/1357064 [ android android-pixel-6 no-passthrough ] conformance/rendering/blending.html [ Failure ]
 
+# finder:group-start crbug.com/1383180 failures happen in many tests, so can be classified as stale for one specific test
+crbug.com/1383180 [ android android-pixel-6 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ]
+crbug.com/1383180 [ android android-pixel-6 target-cpu-64 ] conformance/textures/misc/texture-video-transparent.html [ RetryOnFailure ]
+crbug.com/1383180 [ android android-pixel-6 ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ]
+crbug.com/1383180 [ android android-pixel-6 ] conformance/textures/video/* [ RetryOnFailure ]
+# finder:group-end
 
 ## Misc failures ##
 
diff --git a/content/web_test/browser/web_test_content_browser_client.cc b/content/web_test/browser/web_test_content_browser_client.cc
index 0e829b22..b88f3f4 100644
--- a/content/web_test/browser/web_test_content_browser_client.cc
+++ b/content/web_test/browser/web_test_content_browser_client.cc
@@ -89,6 +89,7 @@
 
 #if BUILDFLAG(IS_WIN)
 #include "base/strings/utf_string_conversions.h"
+#include "sandbox/policy/features.h"
 #include "sandbox/policy/mojom/sandbox.mojom.h"
 #include "sandbox/policy/win/sandbox_win.h"
 #include "sandbox/win/src/sandbox.h"
@@ -664,17 +665,20 @@
   if (sandbox_type == sandbox::mojom::Sandbox::kRenderer) {
     if (policy->GetConfig()->IsConfigured())
       return true;
-
-    // Add sideloaded font files for testing. See also DIR_WINDOWS_FONTS
-    // addition in |StartSandboxedProcess|.
-    std::vector<std::string> font_files = switches::GetSideloadFontFiles();
-    for (std::vector<std::string>::const_iterator i(font_files.begin());
-         i != font_files.end(); ++i) {
-      sandbox::ResultCode result = policy->GetConfig()->AddRule(
-          sandbox::SubSystem::kFiles, sandbox::Semantics::kFilesAllowReadonly,
-          base::UTF8ToWide(*i).c_str());
-      if (result != sandbox::SBOX_ALL_OK)
-        return false;
+    if (base::FeatureList::IsEnabled(
+            sandbox::policy::features::kWinSboxAllowSystemFonts)) {
+      // Add sideloaded font files for testing. See also DIR_WINDOWS_FONTS
+      // addition in |StartSandboxedProcess|.
+      std::vector<std::string> font_files = switches::GetSideloadFontFiles();
+      for (std::vector<std::string>::const_iterator i(font_files.begin());
+           i != font_files.end(); ++i) {
+        sandbox::ResultCode result = policy->GetConfig()->AddRule(
+            sandbox::SubSystem::kFiles, sandbox::Semantics::kFilesAllowReadonly,
+            base::UTF8ToWide(*i).c_str());
+        if (result != sandbox::SBOX_ALL_OK) {
+          return false;
+        }
+      }
     }
   }
   return true;
diff --git a/device/bluetooth/bluetooth_adapter_mac_unittest.mm b/device/bluetooth/bluetooth_adapter_mac_unittest.mm
index ecb61ca2..fc9f20d 100644
--- a/device/bluetooth/bluetooth_adapter_mac_unittest.mm
+++ b/device/bluetooth/bluetooth_adapter_mac_unittest.mm
@@ -84,10 +84,7 @@
     void SimulatePropertyListFileChanged(
         const base::FilePath& path,
         const std::string& changed_file_content) {
-      auto expected_file_size = changed_file_content.length();
-      ASSERT_EQ(static_cast<int>(expected_file_size),
-                base::WriteFile(path, changed_file_content.data(),
-                                expected_file_size));
+      ASSERT_TRUE(base::WriteFile(path, changed_file_content));
       OnPropertyListFileChangedOnFileThread(path, false /* error */);
     }
 
diff --git a/docs/linux/debugging.md b/docs/linux/debugging.md
index 587080a..d0251ea2 100644
--- a/docs/linux/debugging.md
+++ b/docs/linux/debugging.md
@@ -145,6 +145,16 @@
 gdb -p <pid>
 ```
 
+#### Debugging run_web_tests.py renderers
+
+The `debug_renderer` script can also be used to debug the renderer running
+a web test. To do so, simply call `run_web_tests.py` from `debug_renderer.py`
+with all of the standard arguments for `run_web_tests.py`. For example:
+
+```sh
+./third_party/blink/tools/debug_renderer ./third_party/blink/tools/run_web_tests.py [run_web_test args]
+```
+
 #### Selective breakpoints
 
 When debugging both the browser and renderer process, you might want to have
diff --git a/docs/ui/views/images/views_examples_showcase.gif b/docs/ui/views/images/views_examples_showcase.gif
new file mode 100644
index 0000000..afd43e0
--- /dev/null
+++ b/docs/ui/views/images/views_examples_showcase.gif
Binary files differ
diff --git a/extensions/browser/api/networking_private/networking_private_api.cc b/extensions/browser/api/networking_private/networking_private_api.cc
index f51920a1..32fcc1bd 100644
--- a/extensions/browser/api/networking_private/networking_private_api.cc
+++ b/extensions/browser/api/networking_private/networking_private_api.cc
@@ -305,7 +305,7 @@
 
   GetDelegate(browser_context())
       ->CreateNetwork(
-          params->shared, base::Value(std::move(properties_dict)),
+          params->shared, std::move(properties_dict),
           base::BindOnce(&NetworkingPrivateCreateNetworkFunction::Success,
                          this),
           base::BindOnce(&NetworkingPrivateCreateNetworkFunction::Failure,
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc
index a351c654..b783191 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -403,7 +403,7 @@
 
 void NetworkingPrivateChromeOS::CreateNetwork(
     bool shared,
-    base::Value properties,
+    base::Value::Dict properties,
     StringCallback success_callback,
     FailureCallback failure_callback) {
   std::string user_id_hash, error;
@@ -414,11 +414,11 @@
     return;
   }
 
-  const std::string guid = GetStringFromDictionary(
-      properties.GetDict(), ::onc::network_config::kGUID);
+  const std::string guid =
+      GetStringFromDictionary(properties, ::onc::network_config::kGUID);
   NET_LOG(USER) << "networkingPrivate.CreateNetwork. GUID=" << guid;
   GetManagedConfigurationHandler()->CreateConfiguration(
-      user_id_hash, properties.GetDict(),
+      user_id_hash, properties,
       base::BindOnce(&NetworkHandlerCreateCallback,
                      std::move(success_callback)),
       base::BindOnce(&NetworkHandlerFailureCallback,
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.h b/extensions/browser/api/networking_private/networking_private_chromeos.h
index 2e08002e..bf3aba0b 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos.h
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.h
@@ -46,7 +46,7 @@
                      VoidCallback success_callback,
                      FailureCallback failure_callback) override;
   void CreateNetwork(bool shared,
-                     base::Value properties,
+                     base::Value::Dict properties,
                      StringCallback success_callback,
                      FailureCallback failure_callback) override;
   void ForgetNetwork(const std::string& guid,
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
index 2b23555..cc1b065 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos_unittest.cc
@@ -191,12 +191,12 @@
     device_test()->AddDevice(kCellularDevicePath, shill::kTypeCellular,
                              "stub_cellular_device1");
 
-    base::Value home_provider(base::Value::Type::DICT);
-    home_provider.SetStringKey("name", "Cellular1_Provider");
-    home_provider.SetStringKey("code", "000000");
-    home_provider.SetStringKey("country", "us");
+    base::Value::Dict home_provider;
+    home_provider.Set("name", "Cellular1_Provider");
+    home_provider.Set("code", "000000");
+    home_provider.Set("country", "us");
     SetDeviceProperty(kCellularDevicePath, shill::kHomeProviderProperty,
-                      home_provider);
+                      base::Value(std::move(home_provider)));
     SetDeviceProperty(kCellularDevicePath, shill::kTechnologyFamilyProperty,
                       base::Value(shill::kNetworkTechnologyGsm));
     SetDeviceProperty(kCellularDevicePath, shill::kMeidProperty,
@@ -263,13 +263,9 @@
   }
 
   int GetNetworkPriority(const ash::NetworkState* network) {
-    base::Value properties(base::Value::Type::DICT);
+    base::Value::Dict properties;
     network->GetStateProperties(&properties);
-    absl::optional<int> priority =
-        properties.GetDict().FindInt(shill::kPriorityProperty);
-    if (!priority)
-      return -1;
-    return priority.value();
+    return properties.FindInt(shill::kPriorityProperty).value_or(-1);
   }
 
   bool HasServiceProfile(const std::string& service_path,
@@ -311,15 +307,20 @@
     std::move(callback).Run();
   }
 
-  std::unique_ptr<base::Value> GetNetworkUiData(
+  absl::optional<base::Value::Dict> GetNetworkUiData(
       absl::optional<base::Value::Dict>& properties) {
     const std::string* ui_data_json = properties->FindString("UIData");
     if (!ui_data_json) {
-      return nullptr;
+      return absl::nullopt;
     }
 
     JSONStringValueDeserializer deserializer(*ui_data_json);
-    return deserializer.Deserialize(nullptr, nullptr);
+    auto deserialized = deserializer.Deserialize(nullptr, nullptr);
+
+    if (!deserialized || !deserialized->is_dict()) {
+      return absl::nullopt;
+    }
+    return std::move(*deserialized).TakeDict();
   }
 
   bool GetUserSettingStringData(const std::string& guid,
@@ -335,13 +336,13 @@
       return false;
     }
 
-    std::unique_ptr<base::Value> ui_data = GetNetworkUiData(properties);
+    absl::optional<base::Value::Dict> ui_data = GetNetworkUiData(properties);
     if (!ui_data) {
       return false;
     }
 
     const std::string* user_setting =
-        ui_data->FindStringPath("user_settings." + key);
+        ui_data->FindStringByDottedPath("user_settings." + key);
     if (!user_setting) {
       return false;
     }
@@ -908,11 +909,11 @@
       GetNetworkProperties(network->path());
   ASSERT_TRUE(properties.has_value());
 
-  std::unique_ptr<base::Value> ui_data = GetNetworkUiData(properties);
-  ASSERT_TRUE(ui_data && ui_data->is_dict());
+  absl::optional<base::Value::Dict> ui_data = GetNetworkUiData(properties);
+  ASSERT_TRUE(ui_data.has_value());
 
-  EXPECT_TRUE(ui_data->FindPath("user_settings.ProxySettings"));
-  EXPECT_TRUE(ui_data->FindPath("user_settings.StaticIPConfig"));
+  EXPECT_TRUE(ui_data->FindByDottedPath("user_settings.ProxySettings"));
+  EXPECT_TRUE(ui_data->FindByDottedPath("user_settings.StaticIPConfig"));
 }
 
 TEST_F(NetworkingPrivateApiTest, CreatePrivateNetwork_NonMatchingSsids) {
diff --git a/extensions/browser/api/networking_private/networking_private_delegate.h b/extensions/browser/api/networking_private/networking_private_delegate.h
index e28a41a0..a4f6017 100644
--- a/extensions/browser/api/networking_private/networking_private_delegate.h
+++ b/extensions/browser/api/networking_private/networking_private_delegate.h
@@ -89,7 +89,7 @@
                              VoidCallback success_callback,
                              FailureCallback failure_callback) = 0;
   virtual void CreateNetwork(bool shared,
-                             base::Value properties,
+                             base::Value::Dict properties,
                              StringCallback success_callback,
                              FailureCallback failure_callback) = 0;
   virtual void ForgetNetwork(const std::string& guid,
diff --git a/extensions/browser/api/networking_private/networking_private_lacros.cc b/extensions/browser/api/networking_private/networking_private_lacros.cc
index 5e62e97c..ac6a1a8 100644
--- a/extensions/browser/api/networking_private/networking_private_lacros.cc
+++ b/extensions/browser/api/networking_private/networking_private_lacros.cc
@@ -305,7 +305,7 @@
 }
 
 void NetworkingPrivateLacros::CreateNetwork(bool shared,
-                                            base::Value properties,
+                                            base::Value::Dict properties,
                                             StringCallback success_callback,
                                             FailureCallback failure_callback) {
   auto* networking_private =
@@ -314,7 +314,7 @@
     return;
 
   (*networking_private)
-      ->CreateNetwork(shared, std::move(properties),
+      ->CreateNetwork(shared, base::Value(std::move(properties)),
                       StringAdapterCallback(std::move(success_callback),
                                             std::move(failure_callback)));
 }
diff --git a/extensions/browser/api/networking_private/networking_private_lacros.h b/extensions/browser/api/networking_private/networking_private_lacros.h
index ea636d6..6a01ced6 100644
--- a/extensions/browser/api/networking_private/networking_private_lacros.h
+++ b/extensions/browser/api/networking_private/networking_private_lacros.h
@@ -45,7 +45,7 @@
                      VoidCallback success_callback,
                      FailureCallback failure_callback) override;
   void CreateNetwork(bool shared,
-                     base::Value properties,
+                     base::Value::Dict properties,
                      StringCallback success_callback,
                      FailureCallback failure_callback) override;
   void ForgetNetwork(const std::string& guid,
diff --git a/extensions/browser/api/networking_private/networking_private_linux.cc b/extensions/browser/api/networking_private/networking_private_linux.cc
index 3757ed6..7a34187 100644
--- a/extensions/browser/api/networking_private/networking_private_linux.cc
+++ b/extensions/browser/api/networking_private/networking_private_linux.cc
@@ -290,7 +290,7 @@
 }
 
 void NetworkingPrivateLinux::CreateNetwork(bool shared,
-                                           base::Value properties,
+                                           base::Value::Dict properties,
                                            StringCallback success_callback,
                                            FailureCallback failure_callback) {
   ReportNotSupported("CreateNetwork", std::move(failure_callback));
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h
index 9e28373..c4e7c1c5 100644
--- a/extensions/browser/api/networking_private/networking_private_linux.h
+++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -53,7 +53,7 @@
                      VoidCallback success_callback,
                      FailureCallback failure_callback) override;
   void CreateNetwork(bool shared,
-                     base::Value properties,
+                     base::Value::Dict properties,
                      StringCallback success_callback,
                      FailureCallback failure_callback) override;
   void ForgetNetwork(const std::string& guid,
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc
index 7e4e6b9..bb4188f 100644
--- a/extensions/browser/api/networking_private/networking_private_service_client.cc
+++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -200,7 +200,7 @@
 
 void NetworkingPrivateServiceClient::CreateNetwork(
     bool shared,
-    base::Value properties,
+    base::Value::Dict properties,
     StringCallback success_callback,
     FailureCallback failure_callback) {
   ServiceCallbacks* service_callbacks = AddServiceCallbacks();
@@ -214,7 +214,7 @@
       FROM_HERE,
       base::BindOnce(&WiFiService::CreateNetwork,
                      base::Unretained(wifi_service_.get()), shared,
-                     std::move(properties).TakeDict(), network_guid, error),
+                     std::move(properties), network_guid, error),
       base::BindOnce(&NetworkingPrivateServiceClient::AfterCreateNetwork,
                      weak_factory_.GetWeakPtr(), service_callbacks->id,
                      base::Owned(network_guid), base::Owned(error)));
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.h b/extensions/browser/api/networking_private/networking_private_service_client.h
index 5252b24..8143597 100644
--- a/extensions/browser/api/networking_private/networking_private_service_client.h
+++ b/extensions/browser/api/networking_private/networking_private_service_client.h
@@ -61,7 +61,7 @@
                      VoidCallback success_callback,
                      FailureCallback failure_callback) override;
   void CreateNetwork(bool shared,
-                     base::Value properties_dict,
+                     base::Value::Dict properties_dict,
                      StringCallback success_callback,
                      FailureCallback failure_callback) override;
   void ForgetNetwork(const std::string& guid,
diff --git a/extensions/browser/extension_util.cc b/extensions/browser/extension_util.cc
index b0b0b815..0cef133 100644
--- a/extensions/browser/extension_util.cc
+++ b/extensions/browser/extension_util.cc
@@ -24,7 +24,9 @@
 #include "extensions/common/manifest_handlers/incognito_info.h"
 #include "extensions/common/manifest_handlers/shared_module_info.h"
 #include "extensions/common/permissions/permissions_data.h"
+#include "extensions/grit/extensions_browser_resources.h"
 #include "mojo/public/cpp/bindings/clone_traits.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "url/gurl.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -254,6 +256,16 @@
   }
 }
 
+const gfx::ImageSkia& GetDefaultAppIcon() {
+  return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+      IDR_APP_DEFAULT_ICON);
+}
+
+const gfx::ImageSkia& GetDefaultExtensionIcon() {
+  return *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+      IDR_EXTENSION_DEFAULT_ICON);
+}
+
 ExtensionId GetExtensionIdForSiteInstance(
     content::SiteInstance& site_instance) {
   // <webview> guests always store the ExtensionId in the partition domain.
@@ -298,6 +310,14 @@
   return policy->CanAccessDataForOrigin(render_process_id, extension_origin);
 }
 
+bool IsChromeApp(const std::string& extension_id,
+                 content::BrowserContext* context) {
+  const Extension* extension =
+      ExtensionRegistry::Get(context)->enabled_extensions().GetByID(
+          extension_id);
+  return extension->is_platform_app();
+}
+
 bool IsAppLaunchable(const std::string& extension_id,
                      content::BrowserContext* context) {
   int reason = ExtensionPrefs::Get(context)->GetDisableReasons(extension_id);
diff --git a/extensions/browser/extension_util.h b/extensions/browser/extension_util.h
index 04b1df9..b9b4cdd 100644
--- a/extensions/browser/extension_util.h
+++ b/extensions/browser/extension_util.h
@@ -14,7 +14,11 @@
 
 namespace base {
 class FilePath;
-}
+}  // namespace base
+
+namespace gfx {
+class ImageSkia;
+}  // namespace gfx
 
 namespace content {
 class BrowserContext;
@@ -101,6 +105,11 @@
     const std::string& extension_id,
     content::BrowserContext* browser_context);
 
+// Returns the default extension/app icon (for extensions or apps that don't
+// have one).
+const gfx::ImageSkia& GetDefaultExtensionIcon();
+const gfx::ImageSkia& GetDefaultAppIcon();
+
 // Gets the ExtensionId associated with the given `site_instance`.  An empty
 // string is returned when `site_instance` is not associated with an extension.
 ExtensionId GetExtensionIdForSiteInstance(content::SiteInstance& site_instance);
@@ -116,6 +125,10 @@
 bool CanRendererHostExtensionOrigin(int render_process_id,
                                     const ExtensionId& extension_id);
 
+// Returns true if the extension associated with `extension_id` is a Chrome App.
+bool IsChromeApp(const std::string& extension_id,
+                 content::BrowserContext* context);
+
 // Returns true if `extension_id` can be launched (possibly only after being
 // enabled).
 bool IsAppLaunchable(const std::string& extension_id,
diff --git a/fuchsia_web/webengine/browser/web_engine_net_log_observer.cc b/fuchsia_web/webengine/browser/web_engine_net_log_observer.cc
index 28f9621f..672ada0 100644
--- a/fuchsia_web/webengine/browser/web_engine_net_log_observer.cc
+++ b/fuchsia_web/webengine/browser/web_engine_net_log_observer.cc
@@ -18,7 +18,9 @@
 
 namespace {
 
-std::unique_ptr<base::Value> GetWebEngineConstants() {
+// TODO(https://crbug.com/1418110): This should be updated to pass a
+// base::Value::Dict instead of a std::unique_ptr.
+std::unique_ptr<base::Value::Dict> GetWebEngineConstants() {
   base::Value::Dict constants_dict = net::GetNetConstants();
 
   base::Value::Dict dict;
@@ -28,7 +30,7 @@
 
   constants_dict.Set("clientInfo", std::move(dict));
 
-  return std::make_unique<base::Value>(std::move(constants_dict));
+  return std::make_unique<base::Value::Dict>(std::move(constants_dict));
 }
 
 }  // namespace
diff --git a/google_apis/gcm/engine/heartbeat_manager.cc b/google_apis/gcm/engine/heartbeat_manager.cc
index 4a3a00b..0279aa51 100644
--- a/google_apis/gcm/engine/heartbeat_manager.cc
+++ b/google_apis/gcm/engine/heartbeat_manager.cc
@@ -9,7 +9,6 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/location.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
@@ -151,7 +150,6 @@
   // MCS was silently lost during that time, even if a heartbeat is not yet
   // due. Force a heartbeat to detect if the connection is still good.
   base::TimeDelta elapsed = base::Time::Now() - suspend_time_;
-  UMA_HISTOGRAM_LONG_TIMES("GCM.SuspendTime", elapsed);
 
   // Make sure a minimum amount of time has passed before forcing a heartbeat to
   // avoid any tight loop scenarios.
@@ -212,8 +210,6 @@
 
   // If the heartbeat has been missed, manually trigger it.
   if (base::Time::Now() > heartbeat_expected_time_) {
-    UMA_HISTOGRAM_LONG_TIMES("GCM.HeartbeatMissedDelta",
-                             base::Time::Now() - heartbeat_expected_time_);
     OnHeartbeatTriggered();
     return;
   }
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index f1b0e9c..193782d3 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -422,7 +422,7 @@
     libs += [ "android" ]
     deps += [ "//ui/android:ui_java" ]
     sources += [ "command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc" ]
-  } else if (is_mac) {
+  } else if (is_apple) {
     frameworks = [ "IOSurface.framework" ]
     sources += [ "command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc" ]
   } else if (is_win) {
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index f3eec24..ec329f1e 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -198,7 +198,7 @@
   feature_flags_.chromium_image_ycbcr_420v = base::Contains(
       gpu_feature_info.supported_buffer_formats_for_allocation_and_texturing,
       gfx::BufferFormat::YUV_420_BIPLANAR);
-#elif BUILDFLAG(IS_MAC)
+#elif BUILDFLAG(IS_APPLE)
   feature_flags_.chromium_image_ycbcr_420v = true;
 #endif
 
@@ -1246,9 +1246,9 @@
         gfx::BufferFormat::YUV_420_BIPLANAR);
   }
 
-#if BUILDFLAG(IS_MAC)
+#if BUILDFLAG(IS_APPLE)
   // Mac can create GLImages out of AR30 IOSurfaces only after 10.13 which is
-  // required for Chromium.
+  // required for Chromium. iOS based devices seem to handle well also.
   feature_flags_.chromium_image_ar30 = true;
 #elif !BUILDFLAG(IS_WIN)
   // TODO(mcasas): connect in Windows, https://crbug.com/803451
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index e7da934..f39f70f1 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -2578,6 +2578,13 @@
   auto gl_context = gl::init::CreateGLContext(impl_->context_->share_group(),
                                               gl_surface.get(), attribs);
   if (!gl_context) {
+    LOG(ERROR) << "Failed to create GLES3 context, fallback to GLES2.";
+    attribs.client_major_es_version = 2;
+    attribs.client_minor_es_version = 0;
+    gl_context = gl::init::CreateGLContext(impl_->context_->share_group(),
+                                           gl_surface.get(), attribs);
+  }
+  if (!gl_context) {
     impl_->InsertError(
         GL_INVALID_OPERATION,
         "ContextResult::kFatalFailure: Failed to create GL Context "
diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
index 18a596d..f805285 100644
--- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
@@ -806,13 +806,7 @@
   if (gmb_type != gfx::EMPTY_BUFFER && !CanImportGpuMemoryBuffer(gmb_type)) {
     return false;
   }
-  // TODO(crbug.com/969114): Not all shared image factory implementations
-  // support concurrent read/write usage.
-  constexpr uint32_t kInvalidUsage =
-      SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE | SHARED_IMAGE_USAGE_CPU_UPLOAD;
-  if (usage & kInvalidUsage) {
-    return false;
-  }
+
   if (!IsFormatSupported(format)) {
     return false;
   }
diff --git a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc
index 7a2ecea..c2b2dc7 100644
--- a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc
@@ -13,6 +13,7 @@
 #include "gpu/command_buffer/service/shared_image/gl_texture_image_backing_helper.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_format_utils.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
+#include "gpu/command_buffer/service/shared_image/skia_gl_image_representation.h"
 #include "gpu/command_buffer/service/skia_utils.h"
 #include "gpu/vulkan/vulkan_device_queue.h"
 #include "gpu/vulkan/vulkan_fence_helper.h"
@@ -328,9 +329,21 @@
     SharedImageManager* manager,
     MemoryTypeTracker* tracker,
     scoped_refptr<SharedContextState> context_state) {
-  DCHECK_EQ(context_state_, context_state.get());
-  return std::make_unique<SkiaAngleVulkanImageRepresentation>(manager, this,
-                                                              tracker);
+  if (context_state->GrContextIsVulkan()) {
+    DCHECK_EQ(context_state_, context_state.get());
+    return std::make_unique<SkiaAngleVulkanImageRepresentation>(manager, this,
+                                                                tracker);
+  }
+  // If it is not vulkan context, it must be GL context being used with Skia
+  // over passthrough command decoder.
+  DCHECK(context_state->GrContextIsGL());
+  auto gl_representation = ProduceGLTexturePassthrough(manager, tracker);
+  if (!gl_representation) {
+    return nullptr;
+  }
+  return SkiaGLImageRepresentation::Create(std::move(gl_representation),
+                                           std::move(context_state), manager,
+                                           this, tracker);
 }
 
 bool AngleVulkanImageBacking::GLTextureImageRepresentationBeginAccess(
diff --git a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc
index 5696769..86636d8 100644
--- a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing_factory.cc
@@ -131,10 +131,6 @@
 bool AngleVulkanImageBackingFactory::CanUseAngleVulkanImageBacking(
     uint32_t usage,
     gfx::GpuMemoryBufferType gmb_type) const {
-  if (usage & ~kSupportedUsage) {
-    return false;
-  }
-
   if (!IsGMBSupported(gmb_type))
     return false;
 
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
index 1c842be..2288716 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
@@ -530,14 +530,6 @@
     return false;
   }
 
-  if (usage & SHARED_IMAGE_USAGE_SCANOUT_DCOMP_SURFACE) {
-    return false;
-  }
-
-  if (usage & SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE) {
-    return false;
-  }
-
   if (gmb_type == gfx::EMPTY_BUFFER) {
     if (GetDXGIFormatForCreateTexture(format) == DXGI_FORMAT_UNKNOWN) {
       return false;
diff --git a/gpu/command_buffer/service/shared_image/egl_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/egl_image_backing_factory.cc
index e165b6c..e9fb719 100644
--- a/gpu/command_buffer/service/shared_image/egl_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/egl_image_backing_factory.cc
@@ -30,7 +30,8 @@
     SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE |
     SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX |
     SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU;
-}
+
+}  // namespace
 
 ///////////////////////////////////////////////////////////////////////////////
 // EGLImageBackingFactory
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
index b4f1911e..84c42aed 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
@@ -17,6 +17,7 @@
 #include "gpu/command_buffer/service/shared_image/external_vk_image_skia_representation.h"
 #include "gpu/command_buffer/service/shared_image/gl_texture_holder.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_format_utils.h"
+#include "gpu/command_buffer/service/shared_image/skia_gl_image_representation.h"
 #include "gpu/command_buffer/service/skia_utils.h"
 #include "gpu/ipc/common/vulkan_ycbcr_info.h"
 #include "gpu/vulkan/vma_wrapper.h"
@@ -726,12 +727,23 @@
     SharedImageManager* manager,
     MemoryTypeTracker* tracker,
     scoped_refptr<SharedContextState> context_state) {
-  // This backing type is only used when vulkan is enabled, so SkiaRenderer
-  // should also be using Vulkan.
-  DCHECK_EQ(context_state_, context_state);
-  DCHECK(context_state->GrContextIsVulkan());
-  return std::make_unique<ExternalVkImageSkiaImageRepresentation>(manager, this,
-                                                                  tracker);
+  if (context_state->GrContextIsVulkan()) {
+    // If this backing type is used when vulkan is enabled, then SkiaRenderer
+    // should also be using Vulkan.
+    DCHECK_EQ(context_state_, context_state);
+    return std::make_unique<ExternalVkImageSkiaImageRepresentation>(
+        manager, this, tracker);
+  }
+  // If it is not vulkan context, it must be GL context being used with Skia
+  // over passthrough command decoder.
+  DCHECK(context_state->GrContextIsGL());
+  auto gl_representation = ProduceGLTexturePassthrough(manager, tracker);
+  if (!gl_representation) {
+    return nullptr;
+  }
+  return SkiaGLImageRepresentation::Create(std::move(gl_representation),
+                                           std::move(context_state), manager,
+                                           this, tracker);
 }
 
 std::unique_ptr<OverlayImageRepresentation>
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
index a5f3845d..b99ae491 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
@@ -204,12 +204,6 @@
     return false;
   }
 
-  // TODO(crbug.com/969114): Not all shared image factory implementations
-  // support concurrent read/write usage.
-  constexpr uint32_t kInvalidUsages = SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
-  if (usage & kInvalidUsages) {
-    return false;
-  }
   if (thread_safe) {
     LOG(ERROR) << "ExternalVkImageBackingFactory currently do not support "
                   "cross-thread usage.";
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
index a5b0a37..f5d08652 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/gl_texture_image_backing_factory.cc
@@ -23,11 +23,8 @@
     SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
     SHARED_IMAGE_USAGE_DISPLAY_WRITE | SHARED_IMAGE_USAGE_DISPLAY_READ |
     SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_OOP_RASTERIZATION |
-    SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_WEBGPU |
-    SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE |
-    SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE |
+    SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE |
     SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_CPU_UPLOAD;
-
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -139,27 +136,23 @@
     return false;
 
   if (has_cpu_upload_usage) {
-    if (!GLTextureImageBacking::SupportsPixelUploadWithFormat(format))
+    if (!GLTextureImageBacking::SupportsPixelUploadWithFormat(format)) {
       return false;
+    }
 
-    // Drop scanout usage for shared memory GMBs to match legacy behaviour
-    // from GLImageBackingFactory.
-    usage = usage & ~SHARED_IMAGE_USAGE_SCANOUT;
-  }
-
-  constexpr uint32_t kInvalidUsages = SHARED_IMAGE_USAGE_VIDEO_DECODE |
-                                      SHARED_IMAGE_USAGE_SCANOUT |
-                                      SHARED_IMAGE_USAGE_WEBGPU;
-  if (usage & kInvalidUsages) {
-    return false;
+    // Don't reject scanout usage for shared memory GMBs to match legacy
+    // behaviour from GLImageBackingFactory.
+  } else {
+    if (usage & SHARED_IMAGE_USAGE_SCANOUT) {
+      return false;
+    }
   }
 
   if (gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE &&
       gl::GetANGLEImplementation() == gl::ANGLEImplementation::kMetal) {
     constexpr uint32_t kMetalInvalidUsages =
         SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_SCANOUT |
-        SHARED_IMAGE_USAGE_VIDEO_DECODE | SHARED_IMAGE_USAGE_GLES2 |
-        SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | SHARED_IMAGE_USAGE_WEBGPU;
+        SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT;
     if (usage & kMetalInvalidUsages) {
       return false;
     }
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory.mm b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory.mm
index 387e9708f..c5926ec9 100644
--- a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory.mm
+++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory.mm
@@ -236,9 +236,7 @@
   if (gmb_type == gfx::SHARED_MEMORY_BUFFER) {
     return false;
   }
-  if (usage & SHARED_IMAGE_USAGE_CPU_UPLOAD) {
-    return false;
-  }
+
   // On macOS, there is no separate interop factory. Any GpuMemoryBuffer-backed
   // image can be used with both OpenGL and Metal
 
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc
index 4d2ccf1..2ba063a5 100644
--- a/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing_factory_unittest.cc
@@ -169,7 +169,7 @@
   EXPECT_TRUE(backing);
   backing->SetCleared();
 
-  GLenum expected_target = GL_TEXTURE_RECTANGLE;
+  GLenum expected_target = gpu::GetPlatformSpecificTextureTarget();
   std::unique_ptr<SharedImageRepresentationFactoryRef> factory_ref =
       shared_image_manager_.Register(std::move(backing),
                                      memory_type_tracker_.get());
@@ -779,7 +779,7 @@
       shared_image_manager_->Register(std::move(backing),
                                       memory_type_tracker_.get());
   EXPECT_TRUE(shared_image);
-  GLenum expected_target = GL_TEXTURE_RECTANGLE;
+  GLenum expected_target = gpu::GetPlatformSpecificTextureTarget();
 
   {
     auto gl_representation =
diff --git a/gpu/command_buffer/service/shared_image/shared_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/shared_image_backing_factory.cc
index 6b783aa2..a025692 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_backing_factory.cc
@@ -38,21 +38,13 @@
     gfx::GpuMemoryBufferType gmb_type,
     GrContextType gr_context_type,
     base::span<const uint8_t> pixel_data) {
-  // TODO(kylechar): Once existing usages are worked out just return false if
-  // !usage_supported.
-  bool usage_supported = (invalid_usages_ & usage) == 0;
-
-  bool is_supported = IsSupported(usage, format, size, thread_safe, gmb_type,
-                                  gr_context_type, pixel_data);
-
-  if (!usage_supported) {
-    // The factory should never report supported with an unsupported usage.
-    CHECK(!is_supported) << " usage=" << CreateLabelForSharedImageUsage(usage)
-                         << ", invalid_usages="
-                         << CreateLabelForSharedImageUsage(invalid_usages_);
+  if (invalid_usages_ & usage) {
+    // This factory doesn't support all the usages.
+    return false;
   }
 
-  return is_supported;
+  return IsSupported(usage, format, size, thread_safe, gmb_type,
+                     gr_context_type, pixel_data);
 }
 
 void SharedImageBackingFactory::InvalidateWeakPtrsForTesting() {
diff --git a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc
index 9c182ed..f1418ae 100644
--- a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc
@@ -29,7 +29,8 @@
     SHARED_IMAGE_USAGE_CPU_UPLOAD | SHARED_IMAGE_USAGE_MIPMAP;
 
 bool IsUsageSupported(uint32_t usage) {
-  return (usage & kSupportedUsage) && !(usage & ~kSupportedUsage);
+  // Must have at least one of the supported usage flags.
+  return usage & kSupportedUsage;
 }
 
 }  // namespace
diff --git a/headless/lib/browser/headless_browser_impl.cc b/headless/lib/browser/headless_browser_impl.cc
index 9e4ca64d..f9fcd93 100644
--- a/headless/lib/browser/headless_browser_impl.cc
+++ b/headless/lib/browser/headless_browser_impl.cc
@@ -160,6 +160,11 @@
   browser_main_parts_->QuitMainMessageLoop();
 }
 
+void HeadlessBrowserImpl::ShutdownWithExitCode(int exit_code) {
+  exit_code_ = exit_code;
+  Shutdown();
+}
+
 std::vector<HeadlessBrowserContext*>
 HeadlessBrowserImpl::GetAllBrowserContexts() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h
index 8c8e671..696d70df 100644
--- a/headless/lib/browser/headless_browser_impl.h
+++ b/headless/lib/browser/headless_browser_impl.h
@@ -66,9 +66,7 @@
   HeadlessBrowserContext::Builder CreateBrowserContextBuilder() override;
   scoped_refptr<base::SingleThreadTaskRunner> BrowserMainThread()
       const override;
-
   void Shutdown() override;
-
   std::vector<HeadlessBrowserContext*> GetAllBrowserContexts() override;
   HeadlessWebContents* GetWebContentsForDevToolsAgentHostId(
       const std::string& devtools_agent_host_id) override;
@@ -113,6 +111,10 @@
                                     const gfx::Rect& bounds);
   ui::Compositor* PlatformGetCompositor(HeadlessWebContentsImpl* web_contents);
 
+  void ShutdownWithExitCode(int exit_code);
+
+  int exit_code() const { return exit_code_; }
+
 #if defined(HEADLESS_USE_PREFS)
   PrefService* GetPrefs();
 #endif
@@ -130,6 +132,7 @@
   absl::optional<HeadlessBrowser::Options> options_;
   raw_ptr<HeadlessBrowserMainParts, DanglingUntriaged> browser_main_parts_ =
       nullptr;
+  int exit_code_ = 0;
 
   base::flat_map<std::string, std::unique_ptr<HeadlessBrowserContextImpl>>
       browser_contexts_;
diff --git a/headless/lib/browser/headless_browser_main_parts_posix.cc b/headless/lib/browser/headless_browser_main_parts_posix.cc
index f351d3f..b19d390 100644
--- a/headless/lib/browser/headless_browser_main_parts_posix.cc
+++ b/headless/lib/browser/headless_browser_main_parts_posix.cc
@@ -37,12 +37,13 @@
 
 class BrowserShutdownHandler {
  public:
+  typedef base::OnceCallback<void(int)> ShutdownCallback;
+
   BrowserShutdownHandler(const BrowserShutdownHandler&) = delete;
   BrowserShutdownHandler& operator=(const BrowserShutdownHandler&) = delete;
 
-  static void Install(base::OnceClosure shutdown_callback) {
-    GetInstance().Init(content::GetUIThreadTaskRunner({}),
-                       std::move(shutdown_callback));
+  static void Install(ShutdownCallback shutdown_callback) {
+    GetInstance().Init(std::move(shutdown_callback));
 
     // We need to handle SIGTERM, because that is how many POSIX-based distros
     // ask processes to quit gracefully at shutdown time.
@@ -73,15 +74,17 @@
     return *instance;
   }
 
-  void Init(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-            base::OnceClosure shutdown_callback) {
-    task_runner_ = std::move(task_runner);
+  void Init(ShutdownCallback shutdown_callback) {
+    task_runner_ = content::GetUIThreadTaskRunner({});
     shutdown_callback_ = std::move(shutdown_callback);
   }
 
   void Shutdown(int signal) {
     if (shutdown_callback_) {
-      if (!task_runner_->PostTask(FROM_HERE, std::move(shutdown_callback_))) {
+      int exit_code = 0x80u + signal;
+      if (!task_runner_->PostTask(
+              FROM_HERE,
+              base::BindOnce(std::move(shutdown_callback_), exit_code))) {
         RAW_LOG(WARNING, "No valid task runner, exiting ungracefully.");
         kill(getpid(), signal);
       }
@@ -115,7 +118,7 @@
   }
 
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  base::OnceClosure shutdown_callback_;
+  ShutdownCallback shutdown_callback_;
 };
 
 }  // namespace
@@ -125,8 +128,8 @@
 #endif
 
 void HeadlessBrowserMainParts::PostCreateMainMessageLoop() {
-  BrowserShutdownHandler::Install(
-      base::BindOnce(&HeadlessBrowserImpl::Shutdown, browser_->GetWeakPtr()));
+  BrowserShutdownHandler::Install(base::BindOnce(
+      &HeadlessBrowserImpl::ShutdownWithExitCode, browser_->GetWeakPtr()));
 
 #if BUILDFLAG(IS_LINUX)
 
diff --git a/headless/lib/browser/headless_browser_main_parts_win.cc b/headless/lib/browser/headless_browser_main_parts_win.cc
index a694be3..0121a8b 100644
--- a/headless/lib/browser/headless_browser_main_parts_win.cc
+++ b/headless/lib/browser/headless_browser_main_parts_win.cc
@@ -9,8 +9,9 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
-#include "base/task/bind_post_task.h"
+#include "base/task/single_thread_task_runner.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "headless/lib/browser/headless_browser_impl.h"
@@ -21,11 +22,15 @@
 
 class BrowserShutdownHandler {
  public:
+  typedef base::OnceCallback<void(int)> ShutdownCallback;
+
   BrowserShutdownHandler(const BrowserShutdownHandler&) = delete;
   BrowserShutdownHandler& operator=(const BrowserShutdownHandler&) = delete;
 
-  static void Install(base::OnceClosure shutdown_callback) {
+  static void Install(ShutdownCallback shutdown_callback) {
     GetInstance().Init(std::move(shutdown_callback));
+
+    PCHECK(::SetConsoleCtrlHandler(ConsoleCtrlHandler, true) != 0);
   }
 
  private:
@@ -39,37 +44,43 @@
     return *instance;
   }
 
-  void Init(base::OnceClosure shutdown_callback) {
+  void Init(ShutdownCallback shutdown_callback) {
+    task_runner_ = content::GetUIThreadTaskRunner({});
     shutdown_callback_ = std::move(shutdown_callback);
-
-    PCHECK(::SetConsoleCtrlHandler(ConsoleCtrlHandler, true) != 0);
   }
 
-  bool Shutdown() {
+  bool Shutdown(DWORD ctrl_type) {
     // If the callback is already consumed, let the default handler do its
     // thing.
     if (!shutdown_callback_) {
       return false;
     }
 
-    std::move(shutdown_callback_).Run();
+    DCHECK_LT(ctrl_type, 0x7fu);
+    int exit_code = 0x80u + ctrl_type;
+    if (!task_runner_->PostTask(
+            FROM_HERE,
+            base::BindOnce(std::move(shutdown_callback_), exit_code))) {
+      RAW_LOG(WARNING, "No valid task runner, exiting ungracefully.");
+      return false;
+    }
 
     return true;
   }
 
   static BOOL WINAPI ConsoleCtrlHandler(DWORD ctrl_type) {
-    return GetInstance().Shutdown();
+    return GetInstance().Shutdown(ctrl_type);
   }
 
-  base::OnceClosure shutdown_callback_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+  ShutdownCallback shutdown_callback_;
 };
 
 }  // namespace
 
 void HeadlessBrowserMainParts::PostCreateMainMessageLoop() {
-  BrowserShutdownHandler::Install(base::BindPostTask(
-      content::GetUIThreadTaskRunner({}),
-      base::BindOnce(&HeadlessBrowserImpl::Shutdown, browser_->GetWeakPtr())));
+  BrowserShutdownHandler::Install(base::BindOnce(
+      &HeadlessBrowserImpl::ShutdownWithExitCode, browser_->GetWeakPtr()));
 }
 
 }  // namespace headless
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc
index 625350c..89967fc 100644
--- a/headless/lib/headless_content_main_delegate.cc
+++ b/headless/lib/headless_content_main_delegate.cc
@@ -376,16 +376,20 @@
   std::unique_ptr<content::BrowserMainRunner> browser_runner =
       content::BrowserMainRunner::Create();
 
-  int exit_code = browser_runner->Initialize(std::move(main_function_params));
-  DCHECK_LT(exit_code, 0) << "content::BrowserMainRunner::Initialize failed in "
-                             "HeadlessContentMainDelegate::RunProcess";
+  int result_code = browser_runner->Initialize(std::move(main_function_params));
+  DCHECK_LT(result_code, 0)
+      << "content::BrowserMainRunner::Initialize failed in "
+         "HeadlessContentMainDelegate::RunProcess";
 
   browser_runner->Run();
   browser_runner->Shutdown();
+
+  int exit_code = browser_->exit_code();
+
   browser_.reset();
 
   // Return an int here to disable calling content::BrowserMain.
-  return 0;
+  return exit_code;
 }
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc
index a3527ab5e..e929bfe 100644
--- a/headless/test/headless_protocol_browsertest.cc
+++ b/headless/test/headless_protocol_browsertest.cc
@@ -168,9 +168,8 @@
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kResetResults)) {
     LOG(INFO) << "Updating expectations at " << expectation_path;
-    int result = base::WriteFile(expectation_path, test_result.data(),
-                                 static_cast<int>(test_result.size()));
-    CHECK(test_result.size() == static_cast<size_t>(result));
+    bool succcess = base::WriteFile(expectation_path, test_result);
+    CHECK(succcess);
   }
 
   std::string expectation;
diff --git a/infra/config/generated/builders/try/android-dawn-arm-rel/properties.json b/infra/config/generated/builders/try/android-dawn-arm-rel/properties.json
index 452588dd..b5e9ff25 100644
--- a/infra/config/generated/builders/try/android-dawn-arm-rel/properties.json
+++ b/infra/config/generated/builders/try/android-dawn-arm-rel/properties.json
@@ -41,11 +41,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/dawn-android-arm-deps-rel/properties.json b/infra/config/generated/builders/try/dawn-android-arm-deps-rel/properties.json
index 23a2698..f3ba88a 100644
--- a/infra/config/generated/builders/try/dawn-android-arm-deps-rel/properties.json
+++ b/infra/config/generated/builders/try/dawn-android-arm-deps-rel/properties.json
@@ -40,11 +40,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json b/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json
index eddd79f..bc7cc625 100644
--- a/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json
+++ b/infra/config/generated/builders/try/dawn-try-mac-amd-exp/properties.json
@@ -79,10 +79,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json b/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json
index 0b18ffb..c03296c 100644
--- a/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json
+++ b/infra/config/generated/builders/try/dawn-try-mac-intel-exp/properties.json
@@ -79,10 +79,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json
index dfe4dc5..394b62e 100644
--- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json
+++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/properties.json
@@ -75,12 +75,9 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
+    "jobs": 150,
     "metrics_project": "chromium-reclient-metrics",
     "scandeps_server": true
   },
diff --git a/infra/config/generated/builders/try/gpu-try-android-m-nexus-5x-64/properties.json b/infra/config/generated/builders/try/gpu-try-android-m-nexus-5x-64/properties.json
index 9201c201..0af7a99 100644
--- a/infra/config/generated/builders/try/gpu-try-android-m-nexus-5x-64/properties.json
+++ b/infra/config/generated/builders/try/gpu-try-android-m-nexus-5x-64/properties.json
@@ -45,11 +45,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/gpu-try-linux-nvidia-dbg/properties.json b/infra/config/generated/builders/try/gpu-try-linux-nvidia-dbg/properties.json
index 75f157b..7ef838f 100644
--- a/infra/config/generated/builders/try/gpu-try-linux-nvidia-dbg/properties.json
+++ b/infra/config/generated/builders/try/gpu-try-linux-nvidia-dbg/properties.json
@@ -72,11 +72,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/gpu-try-linux-nvidia-rel/properties.json b/infra/config/generated/builders/try/gpu-try-linux-nvidia-rel/properties.json
index 95a06a8..1b35083b 100644
--- a/infra/config/generated/builders/try/gpu-try-linux-nvidia-rel/properties.json
+++ b/infra/config/generated/builders/try/gpu-try-linux-nvidia-rel/properties.json
@@ -78,11 +78,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
index ca71d90..e336810 100644
--- a/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
+++ b/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
@@ -53,12 +53,9 @@
   "$build/flakiness": {
     "check_for_flakiness": true
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
+    "jobs": 150,
     "metrics_project": "chromium-reclient-metrics",
     "scandeps_server": true
   },
diff --git a/infra/config/generated/builders/try/mac-dawn-rel/properties.json b/infra/config/generated/builders/try/mac-dawn-rel/properties.json
index f4f5d7b..ef2d7af5 100644
--- a/infra/config/generated/builders/try/mac-dawn-rel/properties.json
+++ b/infra/config/generated/builders/try/mac-dawn-rel/properties.json
@@ -79,10 +79,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/mac-rel-compilator/properties.json b/infra/config/generated/builders/try/mac-rel-compilator/properties.json
index d54c72c3..8280823 100644
--- a/infra/config/generated/builders/try/mac-rel-compilator/properties.json
+++ b/infra/config/generated/builders/try/mac-rel-compilator/properties.json
@@ -159,11 +159,6 @@
   "$build/flakiness": {
     "check_for_flakiness": true
   },
-  "$build/goma": {
-    "jobs": 150,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 300,
diff --git a/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json b/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json
index d968c03..398c86c 100644
--- a/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json
+++ b/infra/config/generated/builders/try/mac-swangle-chromium-try-x64/properties.json
@@ -43,10 +43,6 @@
       "retry_failed_shards": false
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json
index b59355c..62959f4b 100644
--- a/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/mac_chromium_10.13_rel_ng/properties.json
@@ -82,10 +82,6 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
     "jobs": 150,
diff --git a/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json b/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json
index cf07f3c..d92dc124 100644
--- a/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json
+++ b/infra/config/generated/builders/try/mac_chromium_compile_dbg_ng/properties.json
@@ -110,12 +110,9 @@
       "is_compile_only": true
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org"
-  },
   "$build/reclient": {
     "instance": "rbe-chromium-untrusted",
+    "jobs": 150,
     "metrics_project": "chromium-reclient-metrics",
     "scandeps_server": true
   },
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 58e624c..cd545ca3 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -3492,7 +3492,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 54000
@@ -3538,7 +3538,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Android build performance with goma vs reclient.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Deterministic%20Android%20(dbg)\">Deterministic Android (dbg)</a>."
+      description_html: "This builder measures Android build performance with reclient prod vs test.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Deterministic%20Android%20(dbg)\">Deterministic Android (dbg)</a>."
     }
     builders {
       name: "Comparison Android (reclient) (reproxy cache)"
@@ -3582,7 +3582,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 54000
@@ -3628,7 +3628,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Android build performance with goma vs reclient using reproxy's deps cache.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Comparison%20Android%20(reclient)\">Comparison Android (reclient)</a>."
+      description_html: "This builder measures Android build performance with reclient prod vs test using reproxy's deps cache.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Comparison%20Android%20(reclient)\">Comparison Android (reclient)</a>."
     }
     builders {
       name: "Comparison Android (reclient)(CQ)"
@@ -3672,7 +3672,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 54000
@@ -3718,7 +3718,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Android build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel-compilator\">android-pie-arm64-rel-compilator</a>."
+      description_html: "This builder measures Android build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel-compilator\">android-pie-arm64-rel-compilator</a>."
     }
     builders {
       name: "Comparison Linux (reclient)"
@@ -3762,7 +3762,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 21600
@@ -3851,7 +3851,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 21600
@@ -3897,7 +3897,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Linux build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>."
+      description_html: "This builder measures Linux build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>."
     }
     builders {
       name: "Comparison Mac (reclient)"
@@ -3940,7 +3940,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4029,7 +4029,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4075,7 +4075,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Mac build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>."
+      description_html: "This builder measures Mac build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>."
     }
     builders {
       name: "Comparison Mac arm64 (reclient)"
@@ -4118,7 +4118,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4206,7 +4206,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4295,7 +4295,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4384,7 +4384,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4430,7 +4430,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Simple Chrome build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>."
+      description_html: "This builder measures Simple Chrome build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>."
     }
     builders {
       name: "Comparison Windows (8 cores) (reclient)"
@@ -4474,7 +4474,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 36000
@@ -4563,7 +4563,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 21600
@@ -4652,7 +4652,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison"'
+        '  "recipe": "reclient_reclient_comparison"'
         '}'
       priority: 35
       execution_timeout_secs: 21600
@@ -4698,7 +4698,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures Windows build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_rel_ng-compilator\">win10_chromium_x64_rel_ng-compilator</a>."
+      description_html: "This builder measures Windows build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_rel_ng-compilator\">win10_chromium_x64_rel_ng-compilator</a>."
     }
     builders {
       name: "Comparison ios (reclient)"
@@ -4740,7 +4740,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison",'
+        '  "recipe": "reclient_reclient_comparison",'
         '  "xcode_build_version": "14c18"'
         '}'
       priority: 35
@@ -4833,7 +4833,7 @@
         '    ]'
         '  },'
         '  "builder_group": "chromium.fyi",'
-        '  "recipe": "reclient_goma_comparison",'
+        '  "recipe": "reclient_reclient_comparison",'
         '  "xcode_build_version": "14c18"'
         '}'
       priority: 35
@@ -4884,7 +4884,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder measures iOS build performance with goma vs reclient in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator\">ios-simulator</a>."
+      description_html: "This builder measures iOS build performance with reclient prod vs test in cq configuration.<br/>The bot specs should be in sync with <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator\">ios-simulator</a>."
     }
     builders {
       name: "CrWinAsan"
@@ -68095,9 +68095,11 @@
         '      "retry_failed_shards": false'
         '    }'
         '  },'
-        '  "$build/goma": {'
-        '    "rpc_extra_params": "?prod",'
-        '    "server_host": "goma.chromium.org"'
+        '  "$build/reclient": {'
+        '    "instance": "rbe-chromium-untrusted",'
+        '    "jobs": 150,'
+        '    "metrics_project": "chromium-reclient-metrics",'
+        '    "scandeps_server": true'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
diff --git a/infra/config/subprojects/chromium/angle.try.star b/infra/config/subprojects/chromium/angle.try.star
index 3b8d26d..78c03f3 100644
--- a/infra/config/subprojects/chromium/angle.try.star
+++ b/infra/config/subprojects/chromium/angle.try.star
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load("//lib/builders.star", "cpu", "goma", "os", "xcode")
+load("//lib/builders.star", "cpu", "os", "reclient", "xcode")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/try.star", "try_")
 
@@ -20,7 +20,8 @@
     # Max. pending time for builds. CQ considers builds pending >2h as timed
     # out: http://shortn/_8PaHsdYmlq. Keep this in sync.
     expiration_timeout = 2 * time.hour,
-    goma_backend = goma.backend.RBE_PROD,
+    reclient_instance = reclient.instance.DEFAULT_UNTRUSTED,
+    reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
     subproject_list_view = "luci.chromium.try",
     task_template_canary_percentage = 5,
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 6970c09..8b958b6 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1106,10 +1106,10 @@
 ci.builder(
     name = "Comparison Android (reclient)",
     description_html = """\
-This builder measures Android build performance with goma vs reclient.<br/>\
+This builder measures Android build performance with reclient prod vs test.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/ci/Deterministic%20Android%20(dbg)">Deterministic Android (dbg)</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     cores = 16,
     os = os.LINUX_DEFAULT,
     # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*.
@@ -1132,10 +1132,10 @@
 ci.builder(
     name = "Comparison Android (reclient) (reproxy cache)",
     description_html = """\
-This builder measures Android build performance with goma vs reclient using reproxy's deps cache.<br/>\
+This builder measures Android build performance with reclient prod vs test using reproxy's deps cache.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/ci/Comparison%20Android%20(reclient)">Comparison Android (reclient)</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     cores = 16,
     os = os.LINUX_DEFAULT,
     # Target luci-chromium-ci-bionic-us-central1-b-ssd-16-*.
@@ -1157,7 +1157,7 @@
 
 ci.builder(
     name = "Comparison Linux (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     os = os.LINUX_DEFAULT,
     console_view_entry = consoles.console_view_entry(
         category = "linux",
@@ -1176,7 +1176,7 @@
 
 fyi_mac_builder(
     name = "Comparison Mac (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     console_view_entry = consoles.console_view_entry(
@@ -1198,7 +1198,7 @@
 
 fyi_mac_builder(
     name = "Comparison Mac arm64 (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     console_view_entry = consoles.console_view_entry(
@@ -1220,7 +1220,7 @@
 
 fyi_mac_builder(
     name = "Comparison Mac arm64 on arm64 (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     cpu = cpu.ARM64,
@@ -1243,7 +1243,7 @@
 
 ci.builder(
     name = "Comparison Windows (8 cores) (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = 8,
     os = os.WINDOWS_DEFAULT,
@@ -1265,7 +1265,7 @@
 
 ci.builder(
     name = "Comparison Windows (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = 32,
     os = os.WINDOWS_DEFAULT,
@@ -1287,7 +1287,7 @@
 
 ci.builder(
     name = "Comparison Simple Chrome (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     os = os.LINUX_DEFAULT,
     console_view_entry = consoles.console_view_entry(
@@ -1307,7 +1307,7 @@
 
 fyi_mac_builder(
     name = "Comparison ios (reclient)",
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     console_view_entry = consoles.console_view_entry(
@@ -1330,10 +1330,10 @@
 ci.builder(
     name = "Comparison Android (reclient)(CQ)",
     description_html = """\
-This builder measures Android build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures Android build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-rel-compilator">android-pie-arm64-rel-compilator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     cores = 32,
     os = os.LINUX_DEFAULT,
     ssd = True,
@@ -1357,10 +1357,10 @@
 ci.builder(
     name = "Comparison Linux (reclient)(CQ)",
     description_html = """\
-This builder measures Linux build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures Linux build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator">linux-rel-compilator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     cores = 16,
     os = os.LINUX_DEFAULT,
     ssd = True,
@@ -1384,10 +1384,10 @@
 fyi_mac_builder(
     name = "Comparison Mac (reclient)(CQ)",
     description_html = """\
-This builder measures Mac build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures Mac build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator">mac-rel-compilator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     ssd = True,
@@ -1412,10 +1412,10 @@
 ci.builder(
     name = "Comparison Windows (reclient)(CQ)",
     description_html = """\
-This builder measures Windows build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures Windows build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_rel_ng-compilator">win10_chromium_x64_rel_ng-compilator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = 32,
     os = os.WINDOWS_DEFAULT,
@@ -1441,10 +1441,10 @@
 ci.builder(
     name = "Comparison Simple Chrome (reclient)(CQ)",
     description_html = """\
-This builder measures Simple Chrome build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures Simple Chrome build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator">linux-chromeos-rel-compilator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = 32,
     os = os.LINUX_DEFAULT,
@@ -1469,10 +1469,10 @@
 fyi_mac_builder(
     name = "Comparison ios (reclient)(CQ)",
     description_html = """\
-This builder measures iOS build performance with goma vs reclient in cq configuration.<br/>\
+This builder measures iOS build performance with reclient prod vs test in cq configuration.<br/>\
 The bot specs should be in sync with <a href="https://ci.chromium.org/p/chromium/builders/try/ios-simulator">ios-simulator</a>.\
 """,
-    executable = "recipe:reclient_goma_comparison",
+    executable = "recipe:reclient_reclient_comparison",
     builderless = True,
     cores = None,
     ssd = True,
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star
index efdcddd..4fb1de2 100644
--- a/infra/config/subprojects/chromium/gpu.try.star
+++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -97,7 +97,6 @@
         "ci/Android Release (Nexus 5X)",
     ],
     pool = "luci.chromium.gpu.android.nexus5x.try",
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 def gpu_chromeos_builder(*, name, **kwargs):
@@ -223,7 +222,6 @@
         "ci/Linux Debug (NVIDIA)",
     ],
     pool = "luci.chromium.gpu.linux.nvidia.try",
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 gpu_linux_builder(
@@ -233,7 +231,6 @@
         "ci/Linux Release (NVIDIA)",
     ],
     pool = "luci.chromium.gpu.linux.nvidia.try",
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 def gpu_mac_builder(*, name, **kwargs):
@@ -299,7 +296,7 @@
         "ci/Mac FYI Experimental Release (Apple M1)",
     ],
     pool = "luci.chromium.gpu.mac.arm64.apple.m1.try",
-    goma_backend = goma.backend.RBE_PROD,
+    reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
 )
 
 gpu_mac_builder(
diff --git a/infra/config/subprojects/chromium/swangle.try.star b/infra/config/subprojects/chromium/swangle.try.star
index c14f9a6..86e38bfe 100644
--- a/infra/config/subprojects/chromium/swangle.try.star
+++ b/infra/config/subprojects/chromium/swangle.try.star
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load("//lib/builders.star", "cpu", "goma", "os", "reclient")
+load("//lib/builders.star", "cpu", "os", "reclient")
 load("//lib/builder_config.star", "builder_config")
 load("//lib/consoles.star", "consoles")
 load("//lib/try.star", "try_")
@@ -93,7 +93,6 @@
     ),
     pool = "luci.chromium.swangle.chromium.mac.x64.try",
     execution_timeout = 6 * time.hour,
-    goma_backend = goma.backend.RBE_PROD,
 )
 
 swangle_windows_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
index de75c29..d5ba38a5 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
@@ -4,7 +4,7 @@
 """Definitions of builders in the tryserver.chromium.swangle builder group."""
 
 load("//lib/branches.star", "branches")
-load("//lib/builders.star", "goma", "os", "reclient")
+load("//lib/builders.star", "os", "reclient")
 load("//lib/consoles.star", "consoles")
 load("//lib/try.star", "try_")
 
@@ -34,7 +34,6 @@
     mirrors = [
         "ci/Dawn Android arm DEPS Release (Pixel 4)",
     ],
-    goma_backend = goma.backend.RBE_PROD,
     main_list_view = "try",
     test_presentation = resultdb.test_presentation(
         grouping_keys = ["status", "v.test_suite", "v.gpu"],
@@ -181,7 +180,6 @@
     mirrors = [
         "ci/Dawn Android arm Release (Pixel 4)",
     ],
-    goma_backend = goma.backend.RBE_PROD,
     test_presentation = resultdb.test_presentation(
         grouping_keys = ["status", "v.test_suite", "v.gpu"],
     ),
@@ -208,7 +206,6 @@
         "ci/Dawn Mac x64 Release (Intel)",
     ],
     os = os.MAC_ANY,
-    goma_backend = goma.backend.RBE_PROD,
     test_presentation = resultdb.test_presentation(
         grouping_keys = ["status", "v.test_suite", "v.gpu"],
     ),
@@ -223,7 +220,6 @@
     pool = "luci.chromium.gpu.mac.retina.amd.try",
     builderless = True,
     os = os.MAC_ANY,
-    goma_backend = goma.backend.RBE_PROD,
     test_presentation = resultdb.test_presentation(
         grouping_keys = ["status", "v.test_suite", "v.gpu"],
     ),
@@ -238,7 +234,6 @@
     pool = "luci.chromium.gpu.mac.mini.intel.try",
     builderless = True,
     os = os.MAC_ANY,
-    goma_backend = goma.backend.RBE_PROD,
     test_presentation = resultdb.test_presentation(
         grouping_keys = ["status", "v.test_suite", "v.gpu"],
     ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index 40c9c1a..2f9209b 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -137,8 +137,6 @@
     branch_selector = branches.selector.MAC_BRANCHES,
     os = os.MAC_DEFAULT,
     check_for_flakiness = True,
-    goma_backend = goma.backend.RBE_PROD,
-    goma_jobs = goma.jobs.J150,
     main_list_view = "try",
 )
 
@@ -226,7 +224,6 @@
         "ci/Mac Builder",
         "ci/Mac10.13 Tests",
     ],
-    goma_backend = goma.backend.RBE_PROD,
     reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
 )
 
@@ -293,8 +290,8 @@
         is_compile_only = True,
     ),
     os = os.MAC_DEFAULT,
-    goma_backend = goma.backend.RBE_PROD,
     main_list_view = "try",
+    reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     tryjob = try_.job(),
 )
 
@@ -451,8 +448,8 @@
     check_for_flakiness = True,
     coverage_exclude_sources = "ios_test_files_and_test_utils",
     coverage_test_types = ["overall", "unit"],
-    goma_backend = goma.backend.RBE_PROD,
     main_list_view = "try",
+    reclient_jobs = reclient.jobs.LOW_JOBS_FOR_CQ,
     tryjob = try_.job(
         location_filters = [
             "ios/.+",
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 39a4e33..9f8278a 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2614,7 +2614,9 @@
           other {Some required fields are empty. Fill them before saving.}}
       </message>
       <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON" desc="Confirmation button title shown to the user when the address is deleted. [iOS only]">
-          Delete Address
+          {count, plural,
+          =1 {Delete Address}
+          other {Delete Addresses}}
       </message>
       <message name="IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE" desc="Title of the confirmation shown to the user when an account address is deleted. [iOS only]">
           {count, plural,
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1
index 354b7bc..619c28b 100644
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON.png.sha1
@@ -1 +1 @@
-af363e38314727a5e48b3aa352f52703b12f9d8b
\ No newline at end of file
+760297fff8b587f8e3e83cc97052b41c137dcc2d
\ No newline at end of file
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn
index 9930fbe..61dde1e 100644
--- a/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn
+++ b/ios/chrome/browser/safe_browsing/tailored_security/BUILD.gn
@@ -39,6 +39,7 @@
 
   deps = [
     "//components/infobars/core",
+    "//components/safe_browsing/core/browser/tailored_security_service",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.mm b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.mm
index 406a638..b3452e9a 100644
--- a/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.mm
+++ b/ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_infobar_delegate.h"
 
+#import "base/metrics/histogram_functions.h"
+#import "components/safe_browsing/core/browser/tailored_security_service/tailored_security_outcome.h"
 #import "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/grit/ios_chromium_strings.h"
@@ -81,13 +83,25 @@
 
 bool TailoredSecurityServiceInfobarDelegate::Accept() {
   if (web_state_) {
+    bool enabled =
+        message_state_ ==
+        TailoredSecurityServiceMessageState::kConsentedAndFlowEnabled;
+    std::string consentedHistogram =
+        enabled
+            ? "SafeBrowsing.TailoredSecurityConsentedEnabledMessageOutcome"
+            : "SafeBrowsing.TailoredSecurityConsentedDisabledMessageOutcome";
     switch (message_state_) {
       case TailoredSecurityServiceMessageState::kConsentedAndFlowEnabled:
       case TailoredSecurityServiceMessageState::kConsentedAndFlowDisabled:
+        base::UmaHistogramEnumeration(consentedHistogram,
+                                      TailoredSecurityOutcome::kSettings);
         SafeBrowsingTabHelper::FromWebState(web_state_.get())
             ->OpenSafeBrowsingSettings();
         break;
       case TailoredSecurityServiceMessageState::kUnconsentedAndFlowEnabled:
+        base::UmaHistogramEnumeration(
+            "SafeBrowsing.TailoredSecurityUnconsentedInFlowMessageOutcome",
+            TailoredSecurityOutcome::kAccepted);
         ChromeBrowserState* browser_state =
             ChromeBrowserState::FromBrowserState(web_state_->GetBrowserState());
         SetSafeBrowsingState(
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
index 1c6a8f3..99cf538 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -474,9 +474,9 @@
       // Lays out content vertically for standard view.
       self.buttonVerticalStackView.axis = UILayoutConstraintAxisVertical;
       self.buttonVerticalStackView.spacing =
-          kTitledPromoStyle.kButtonStackViewSubViewSpacing;
+          kStandardPromoStyle.kButtonStackViewSubViewSpacing;
       self.mainPromoStackView.spacing =
-          kTitledPromoStyle.kMainPromoSubViewSpacing;
+          kStandardPromoStyle.kMainPromoSubViewSpacing;
       self.contentStackView.axis = UILayoutConstraintAxisVertical;
       self.contentStackView.spacing =
           kStandardPromoStyle.kContentStackViewSubViewSpacing;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
index b237fdac..2077bec1 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -286,6 +286,15 @@
 - (void)viewSafeAreaInsetsDidChange {
   [super viewSafeAreaInsetsDidChange];
 
+  if (!self.viewDidAppear) {
+    // The native views in the NTP are not top anchored to the surface in any
+    // way. They are stacked on top of the top of the Feed contents, and the top
+    // Safe Area insets are factored in the height needed above the feed in
+    // -updateFeedInsetsForContentAbove. Update that height here as it is the
+    // soonest place the Safe Area insets are ready.
+    [self updateHeightAboveFeedAndScrollToTopIfNeeded];
+  }
+
   [self.headerController updateConstraints];
 }
 
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
index 9acbac6..ecf7ee9a 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_settings_egtest.mm
@@ -183,10 +183,12 @@
 }
 
 // Returns the delete button on the deletion confirmation action sheet.
-- (id<GREYMatcher>)confirmDeleteAddressButton {
+- (id<GREYMatcher>)confirmButtonForNumberOfAddressesBeingDeleted:
+    (int)numberOfAddresses {
   return grey_allOf(
-      grey_accessibilityLabel(l10n_util::GetNSString(
-          IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON)),
+      grey_accessibilityLabel(l10n_util::GetPluralNSStringF(
+          IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON,
+          numberOfAddresses)),
       grey_accessibilityTrait(UIAccessibilityTraitButton),
       grey_userInteractionEnabled(), nil);
 }
@@ -378,7 +380,8 @@
                                           SettingsBottomToolbarDeleteButton()]
       performAction:grey_tap()];
 
-  [[EarlGrey selectElementWithMatcher:[self confirmDeleteAddressButton]]
+  [[EarlGrey selectElementWithMatcher:
+                 [self confirmButtonForNumberOfAddressesBeingDeleted:1]]
       performAction:grey_tap()];
   WaitForActivityOverlayToDisappear();
 
@@ -410,7 +413,8 @@
                                        UIAccessibilityTraitNotEnabled)),
                                    nil)] performAction:grey_tap()];
 
-  [[EarlGrey selectElementWithMatcher:[self confirmDeleteAddressButton]]
+  [[EarlGrey selectElementWithMatcher:
+                 [self confirmButtonForNumberOfAddressesBeingDeleted:1]]
       performAction:grey_tap()];
   WaitForActivityOverlayToDisappear();
 
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
index 243ce79..c321142 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
@@ -553,6 +553,21 @@
   }
 }
 
+#pragma mark - PopoverLabelViewControllerDelegate
+
+- (void)didTapLinkURL:(NSURL*)URL {
+  [self view:nil didTapLinkURL:[[CrURL alloc] initWithNSURL:URL]];
+}
+
+#pragma mark - AutofillProfileEditCoordinatorDelegate
+
+- (void)autofillProfileEditCoordinatorTableViewControllerDidFinish:
+    (AutofillProfileEditCoordinator*)coordinator {
+  DCHECK_EQ(self.autofillProfileEditCoordinator, coordinator);
+  self.autofillProfileEditCoordinator.delegate = nil;
+  self.autofillProfileEditCoordinator = nil;
+}
+
 #pragma mark - Private
 
 // Removes the item from the personal data manager model.
@@ -626,32 +641,42 @@
   }
 }
 
-#pragma mark - PopoverLabelViewControllerDelegate
-
-- (void)didTapLinkURL:(NSURL*)URL {
-  [self view:nil didTapLinkURL:[[CrURL alloc] initWithNSURL:URL]];
-}
-
-#pragma mark - AutofillProfileEditCoordinatorDelegate
-
-- (void)autofillProfileEditCoordinatorTableViewControllerDidFinish:
-    (AutofillProfileEditCoordinator*)coordinator {
-  DCHECK_EQ(self.autofillProfileEditCoordinator, coordinator);
-  self.autofillProfileEditCoordinator.delegate = nil;
-  self.autofillProfileEditCoordinator = nil;
-}
-
-#pragma mark - Private
-
 // Shows the action sheet asking for the confirmation on delete from the user.
 - (void)showDeletionConfirmationForIndexPaths:
     (NSArray<NSIndexPath*>*)indexPaths {
-  NSString* deletionConfirmationString =
-      [self getDeletionConfirmationStringFromIndexPaths:indexPaths];
-  if (deletionConfirmationString == nil) {
+  BOOL accountProfiles = NO;
+  BOOL syncProfiles = NO;
+
+  int profileCount = 0;
+
+  for (NSIndexPath* indexPath in indexPaths) {
+    if (![self isItemTypeForIndexPathAddress:indexPath]) {
+      continue;
+    }
+    profileCount++;
+    AutofillProfileItem* item = base::mac::ObjCCastStrict<AutofillProfileItem>(
+        [self.tableViewModel itemAtIndexPath:indexPath]);
+    switch (item.autofillProfileSource) {
+      case AutofillAccountProfile:
+        accountProfiles = YES;
+        break;
+      case AutofillSyncableProfile:
+        syncProfiles = YES;
+        break;
+      case AutofillLocalProfile:
+        break;
+    }
+  }
+
+  // Can happen if user presses delete in quick succesion.
+  if (!profileCount) {
     return;
   }
 
+  NSString* deletionConfirmationString =
+      [self getDeletionConfirmationStringUsingProfileCount:profileCount
+                                           accountProfiles:accountProfiles
+                                              syncProfiles:syncProfiles];
   self.deletionSheetCoordinator = [[ActionSheetCoordinator alloc]
       initWithBaseViewController:self
                          browser:_browser
@@ -669,8 +694,9 @@
   __weak AutofillProfileTableViewController* weakSelf = self;
   [self.deletionSheetCoordinator
       addItemWithTitle:
-          l10n_util::GetNSString(
-              IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON)
+          l10n_util::GetPluralNSStringF(
+              IDS_IOS_SETTINGS_AUTOFILL_DELETE_ADDRESS_CONFIRMATION_BUTTON,
+              profileCount)
                 action:^{
                   [weakSelf willDeleteItemsAtIndexPaths:indexPaths];
                   // TODO(crbug.com/650390) Generalize removing empty sections
@@ -681,35 +707,14 @@
   [self.deletionSheetCoordinator start];
 }
 
-// Returns the deletion confirmation message string based on the
-// source of the profiles that are being deleted.
-- (NSString*)getDeletionConfirmationStringFromIndexPaths:
-    (NSArray<NSIndexPath*>*)indexPaths {
-  BOOL hasAccountProfiles = NO;
-  BOOL hasSyncProfiles = NO;
-
-  int profileCount = 0;
-
-  for (NSIndexPath* indexPath in indexPaths) {
-    if (![self isItemTypeForIndexPathAddress:indexPath]) {
-      continue;
-    }
-    profileCount++;
-    AutofillProfileItem* item = base::mac::ObjCCastStrict<AutofillProfileItem>(
-        [self.tableViewModel itemAtIndexPath:indexPath]);
-    switch (item.autofillProfileSource) {
-      case AutofillAccountProfile:
-        hasAccountProfiles = YES;
-        break;
-      case AutofillSyncableProfile:
-        hasSyncProfiles = YES;
-        break;
-      case AutofillLocalProfile:
-        break;
-    }
-  }
-
-  if (hasAccountProfiles) {
+// Returns the deletion confirmation message string based on
+// `profileCount` and if it the source has any `accountProfiles` or
+// `syncProfiles`.
+- (NSString*)getDeletionConfirmationStringUsingProfileCount:(int)profileCount
+                                            accountProfiles:
+                                                (BOOL)accountProfiles
+                                               syncProfiles:(BOOL)syncProfiles {
+  if (accountProfiles) {
     std::u16string pattern = l10n_util::GetStringUTF16(
         IDS_IOS_SETTINGS_AUTOFILL_DELETE_ACCOUNT_ADDRESS_CONFIRMATION_TITLE);
     std::u16string confirmationString =
@@ -718,19 +723,14 @@
             "count", profileCount);
     return base::SysUTF16ToNSString(confirmationString);
   }
-  if (hasSyncProfiles) {
+  if (syncProfiles) {
     return l10n_util::GetPluralNSStringF(
         IDS_IOS_SETTINGS_AUTOFILL_DELETE_SYNC_ADDRESS_CONFIRMATION_TITLE,
         profileCount);
   }
-  if (profileCount > 0) {
-    return l10n_util::GetPluralNSStringF(
-        IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE,
-        profileCount);
-  }
-
-  // Can happen if user presses delete in quick succesion.
-  return nil;
+  return l10n_util::GetPluralNSStringF(
+      IDS_IOS_SETTINGS_AUTOFILL_DELETE_LOCAL_ADDRESS_CONFIRMATION_TITLE,
+      profileCount);
 }
 
 // Returns true when the item type for `indexPath` is Address.
diff --git a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
index 02c3e9f5..421996e 100644
--- a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
+++ b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/credential_provider_extension/reauthentication_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/consent_coordinator.h"
 #import "ios/chrome/credential_provider_extension/ui/credential_list_coordinator.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/feature_flags.h"
 #import "ios/chrome/credential_provider_extension/ui/stale_credentials_view_controller.h"
 
@@ -39,7 +40,8 @@
 }
 
 @interface CredentialProviderViewController () <ConfirmationAlertActionHandler,
-                                                SuccessfulReauthTimeAccessor>
+                                                SuccessfulReauthTimeAccessor,
+                                                CredentialResponseHandler>
 
 // Interface for the persistent credential store.
 @property(nonatomic, strong) id<CredentialStore> credentialStore;
@@ -161,9 +163,9 @@
 }
 
 - (void)prepareInterfaceForExtensionConfiguration {
-  self.consentCoordinator = [[ConsentCoordinator alloc]
-      initWithBaseViewController:self
-                         context:self.extensionContext];
+  self.consentCoordinator =
+      [[ConsentCoordinator alloc] initWithBaseViewController:self
+                                   credentialResponseHandler:self];
   [self.consentCoordinator start];
 }
 
@@ -234,8 +236,7 @@
       ASPasswordCredential* ASCredential =
           [ASPasswordCredential credentialWithUser:credential.user
                                           password:password];
-      [self.extensionContext completeRequestWithSelectedCredential:ASCredential
-                                                 completionHandler:nil];
+      [self completeRequestWithSelectedCredential:ASCredential];
       return;
     }
   }
@@ -316,15 +317,27 @@
   self.listCoordinator = [[CredentialListCoordinator alloc]
       initWithBaseViewController:self
                  credentialStore:self.credentialStore
-                         context:self.extensionContext
               serviceIdentifiers:serviceIdentifiers
-         reauthenticationHandler:self.reauthenticationHandler];
+         reauthenticationHandler:self.reauthenticationHandler
+       credentialResponseHandler:self];
   [self.listCoordinator start];
   UpdateUMACountForKey(app_group::kCredentialExtensionDisplayCount);
 }
 
+// Convenience wrapper for
+// -completeRequestWithSelectedCredential:completionHandler:.
+- (void)completeRequestWithSelectedCredential:
+    (ASPasswordCredential*)credential {
+  [self.listCoordinator stop];
+  self.listCoordinator = nil;
+  [self.extensionContext completeRequestWithSelectedCredential:credential
+                                             completionHandler:nil];
+}
+
 // Convenience wrapper for -cancelRequestWithError.
 - (void)exitWithErrorCode:(ASExtensionErrorCode)errorCode {
+  [self.listCoordinator stop];
+  self.listCoordinator = nil;
   NSError* error = [[NSError alloc] initWithDomain:ASExtensionErrorDomain
                                               code:errorCode
                                           userInfo:nil];
@@ -350,4 +363,20 @@
   // No-op.
 }
 
+#pragma mark - CredentialResponseHandler
+
+- (void)userSelectedCredential:(ASPasswordCredential*)credential {
+  [self completeRequestWithSelectedCredential:credential];
+}
+
+- (void)userCancelledRequestWithErrorCode:(ASExtensionErrorCode)errorCode {
+  [self exitWithErrorCode:errorCode];
+}
+
+- (void)completeExtensionConfigurationRequest {
+  [self.consentCoordinator stop];
+  self.consentCoordinator = nil;
+  [self.extensionContext completeExtensionConfigurationRequest];
+}
+
 @end
diff --git a/ios/chrome/credential_provider_extension/ui/BUILD.gn b/ios/chrome/credential_provider_extension/ui/BUILD.gn
index a92ead52..248c7a3 100644
--- a/ios/chrome/credential_provider_extension/ui/BUILD.gn
+++ b/ios/chrome/credential_provider_extension/ui/BUILD.gn
@@ -23,6 +23,7 @@
     "credential_list_ui_handler.h",
     "credential_list_view_controller.h",
     "credential_list_view_controller.mm",
+    "credential_response_handler.h",
     "empty_credentials_view_controller.h",
     "empty_credentials_view_controller.mm",
     "new_password_coordinator.h",
diff --git a/ios/chrome/credential_provider_extension/ui/consent_coordinator.h b/ios/chrome/credential_provider_extension/ui/consent_coordinator.h
index a065c7bf..66162f8 100644
--- a/ios/chrome/credential_provider_extension/ui/consent_coordinator.h
+++ b/ios/chrome/credential_provider_extension/ui/consent_coordinator.h
@@ -7,8 +7,8 @@
 
 #import <Foundation/Foundation.h>
 
-@class ASCredentialProviderExtensionContext;
 @class ConsentCoordinator;
+@protocol CredentialResponseHandler;
 @class ReauthenticationHandler;
 @class UIViewController;
 
@@ -16,9 +16,9 @@
 
 // Default initializer. When the coordinator is started it will present on
 // `baseViewController`.
-- (instancetype)
-    initWithBaseViewController:(UIViewController*)baseViewController
-                       context:(ASCredentialProviderExtensionContext*)context
+- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController
+                 credentialResponseHandler:
+                     (id<CredentialResponseHandler>)credentialResponseHandler
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/credential_provider_extension/ui/consent_coordinator.mm b/ios/chrome/credential_provider_extension/ui/consent_coordinator.mm
index 10a0432..7cb6198 100644
--- a/ios/chrome/credential_provider_extension/ui/consent_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/consent_coordinator.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/credential_provider_extension/metrics_util.h"
 #import "ios/chrome/credential_provider_extension/reauthentication_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/consent_view_controller.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -30,20 +31,21 @@
 @property(nonatomic, strong)
     PopoverLabelViewController* learnMoreViewController;
 
-// The extension context for the credential provider.
-@property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
+// The response handler for the credential configuration.
+@property(nonatomic, weak) id<CredentialResponseHandler>
+    credentialResponseHandler;
 
 @end
 
 @implementation ConsentCoordinator
 
-- (instancetype)
-    initWithBaseViewController:(UIViewController*)baseViewController
-                       context:(ASCredentialProviderExtensionContext*)context {
+- (instancetype)initWithBaseViewController:(UIViewController*)baseViewController
+                 credentialResponseHandler:
+                     (id<CredentialResponseHandler>)credentialResponseHandler {
   self = [super init];
   if (self) {
     _baseViewController = baseViewController;
-    _context = context;
+    _credentialResponseHandler = credentialResponseHandler;
   }
   return self;
 }
@@ -71,7 +73,7 @@
 
 // Invoked when the primary action button is tapped.
 - (void)didTapPrimaryActionButton {
-  [self.context completeExtensionConfigurationRequest];
+  [self.credentialResponseHandler completeExtensionConfigurationRequest];
 }
 
 // Invoked when the learn more button is tapped.
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.h b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.h
index 09632a9..2a54061b 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.h
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.h
@@ -8,7 +8,7 @@
 #import <Foundation/Foundation.h>
 
 @class ASCredentialServiceIdentifier;
-@class ASCredentialProviderExtensionContext;
+@protocol CredentialResponseHandler;
 @protocol CredentialStore;
 @class ReauthenticationHandler;
 @class UIViewController;
@@ -22,10 +22,11 @@
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
                credentialStore:(id<CredentialStore>)credentialStore
-                       context:(ASCredentialProviderExtensionContext*)context
             serviceIdentifiers:
                 (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
        reauthenticationHandler:(ReauthenticationHandler*)reauthenticationHandler
+     credentialResponseHandler:
+         (id<CredentialResponseHandler>)credentialResponseHandler
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
index e077babc6..33b8bc69 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_coordinator.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/credential_provider_extension/ui/credential_list_mediator.h"
 #import "ios/chrome/credential_provider_extension/ui/credential_list_ui_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/credential_list_view_controller.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/empty_credentials_view_controller.h"
 #import "ios/chrome/credential_provider_extension/ui/feature_flags.h"
 #import "ios/chrome/credential_provider_extension/ui/new_password_coordinator.h"
@@ -27,7 +28,8 @@
 
 @interface CredentialListCoordinator () <ConfirmationAlertActionHandler,
                                          CredentialListUIHandler,
-                                         CredentialDetailsConsumerDelegate>
+                                         CredentialDetailsConsumerDelegate,
+                                         NewPasswordCoordinatorDelegate>
 
 // Base view controller from where `viewController` is presented.
 @property(nonatomic, weak) UIViewController* baseViewController;
@@ -41,9 +43,6 @@
 // Interface for the persistent credential store.
 @property(nonatomic, weak) id<CredentialStore> credentialStore;
 
-// The extension context in which the credential list was started.
-@property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
-
 // The service identifiers to prioritize in a match is found.
 @property(nonatomic, strong)
     NSArray<ASCredentialServiceIdentifier*>* serviceIdentifiers;
@@ -55,6 +54,10 @@
 // hardware for authentication is available.
 @property(nonatomic, weak) ReauthenticationHandler* reauthenticationHandler;
 
+// The handler to use when a credential is selected.
+@property(nonatomic, weak) id<CredentialResponseHandler>
+    credentialResponseHandler;
+
 @end
 
 @implementation CredentialListCoordinator
@@ -62,18 +65,18 @@
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
                credentialStore:(id<CredentialStore>)credentialStore
-                       context:(ASCredentialProviderExtensionContext*)context
             serviceIdentifiers:
                 (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
-       reauthenticationHandler:
-           (ReauthenticationHandler*)reauthenticationHandler {
+       reauthenticationHandler:(ReauthenticationHandler*)reauthenticationHandler
+     credentialResponseHandler:
+         (id<CredentialResponseHandler>)credentialResponseHandler {
   self = [super init];
   if (self) {
     _baseViewController = baseViewController;
-    _context = context;
     _serviceIdentifiers = serviceIdentifiers;
     _credentialStore = credentialStore;
     _reauthenticationHandler = reauthenticationHandler;
+    _credentialResponseHandler = credentialResponseHandler;
   }
   return self;
 }
@@ -82,11 +85,11 @@
   CredentialListViewController* credentialListViewController =
       [[CredentialListViewController alloc] init];
   self.mediator = [[CredentialListMediator alloc]
-        initWithConsumer:credentialListViewController
-               UIHandler:self
-         credentialStore:self.credentialStore
-                 context:self.context
-      serviceIdentifiers:self.serviceIdentifiers];
+               initWithConsumer:credentialListViewController
+                      UIHandler:self
+                credentialStore:self.credentialStore
+             serviceIdentifiers:self.serviceIdentifiers
+      credentialResponseHandler:self.credentialResponseHandler];
 
   self.viewController = [[UINavigationController alloc]
       initWithRootViewController:credentialListViewController];
@@ -99,6 +102,10 @@
 }
 
 - (void)stop {
+  if (self.createPasswordCoordinator) {
+    [self.createPasswordCoordinator stop];
+    self.createPasswordCoordinator = nil;
+  }
   [self.viewController.presentingViewController
       dismissViewControllerAnimated:NO
                          completion:nil];
@@ -128,8 +135,7 @@
       ASPasswordCredential* ASCredential =
           [ASPasswordCredential credentialWithUser:credential.user
                                           password:password];
-      [self.context completeRequestWithSelectedCredential:ASCredential
-                                        completionHandler:nil];
+      [self.credentialResponseHandler userSelectedCredential:ASCredential];
     }
   }];
 }
@@ -146,20 +152,18 @@
 - (void)showCreateNewPasswordUI {
   self.createPasswordCoordinator = [[NewPasswordCoordinator alloc]
       initWithBaseViewController:self.viewController
-                         context:self.context
               serviceIdentifiers:self.serviceIdentifiers
-             existingCredentials:self.credentialStore];
+             existingCredentials:self.credentialStore
+       credentialResponseHandler:self.credentialResponseHandler];
+  self.createPasswordCoordinator.delegate = self;
   [self.createPasswordCoordinator start];
 }
 
 #pragma mark - CredentialDetailsConsumerDelegate
 
 - (void)navigationCancelButtonWasPressed:(UIButton*)button {
-  NSError* error =
-      [[NSError alloc] initWithDomain:ASExtensionErrorDomain
-                                 code:ASExtensionErrorCodeUserCanceled
-                             userInfo:nil];
-  [self.context cancelRequestWithError:error];
+  [self.credentialResponseHandler
+      userCancelledRequestWithErrorCode:ASExtensionErrorCodeUserCanceled];
 }
 
 - (void)unlockPasswordForCredential:(id<Credential>)credential
@@ -179,17 +183,22 @@
 - (void)confirmationAlertDismissAction {
   // Finish the extension. There is no recovery from the empty credentials
   // state.
-  NSError* error =
-      [[NSError alloc] initWithDomain:ASExtensionErrorDomain
-                                 code:ASExtensionErrorCodeUserCanceled
-                             userInfo:nil];
-  [self.context cancelRequestWithError:error];
+  [self.credentialResponseHandler
+      userCancelledRequestWithErrorCode:ASExtensionErrorCodeUserCanceled];
 }
 
 - (void)confirmationAlertPrimaryAction {
   // No-op.
 }
 
+#pragma mark - NewPasswordCoordinatorDelegate
+
+- (void)dismissNewPasswordCoordinator:
+    (NewPasswordCoordinator*)newPasswordCoordinator {
+  [self.createPasswordCoordinator stop];
+  self.createPasswordCoordinator = nil;
+}
+
 #pragma mark - Private
 
 // Asks user for hardware reauthentication if needed.
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.h b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.h
index 5757dce..fb4a040 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.h
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.h
@@ -8,9 +8,9 @@
 #import <Foundation/Foundation.h>
 
 @class ASCredentialServiceIdentifier;
-@class ASCredentialProviderExtensionContext;
 @protocol CredentialListConsumer;
 @protocol CredentialListUIHandler;
+@protocol CredentialResponseHandler;
 @protocol CredentialStore;
 
 // This mediator fetches and organizes the credentials for its consumer.
@@ -20,9 +20,10 @@
 - (instancetype)initWithConsumer:(id<CredentialListConsumer>)consumer
                        UIHandler:(id<CredentialListUIHandler>)UIHandler
                  credentialStore:(id<CredentialStore>)credentialStore
-                         context:(ASCredentialProviderExtensionContext*)context
               serviceIdentifiers:
                   (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
+       credentialResponseHandler:
+           (id<CredentialResponseHandler>)credentialResponseHandler
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm
index d65987ec..113f02a8 100644
--- a/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm
+++ b/ios/chrome/credential_provider_extension/ui/credential_list_mediator.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/common/credential_provider/credential_store.h"
 #import "ios/chrome/credential_provider_extension/ui/credential_list_consumer.h"
 #import "ios/chrome/credential_provider_extension/ui/credential_list_ui_handler.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/feature_flags.h"
 #import "ios/chrome/credential_provider_extension/ui/ui_util.h"
 
@@ -31,15 +32,16 @@
 @property(nonatomic, strong)
     NSArray<ASCredentialServiceIdentifier*>* serviceIdentifiers;
 
-// The extension context in which the credential list was started.
-@property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
-
 // List of suggested credentials.
 @property(nonatomic, copy) NSArray<id<Credential>>* suggestedCredentials;
 
 // List of all credentials.
 @property(nonatomic, copy) NSArray<id<Credential>>* allCredentials;
 
+// The response handler for any credential actions.
+@property(nonatomic, weak) id<CredentialResponseHandler>
+    credentialResponseHandler;
+
 @end
 
 @implementation CredentialListMediator
@@ -47,9 +49,10 @@
 - (instancetype)initWithConsumer:(id<CredentialListConsumer>)consumer
                        UIHandler:(id<CredentialListUIHandler>)UIHandler
                  credentialStore:(id<CredentialStore>)credentialStore
-                         context:(ASCredentialProviderExtensionContext*)context
               serviceIdentifiers:
-                  (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers {
+                  (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
+       credentialResponseHandler:
+           (id<CredentialResponseHandler>)credentialResponseHandler {
   self = [super init];
   if (self) {
     _serviceIdentifiers = serviceIdentifiers ?: @[];
@@ -57,7 +60,7 @@
     _consumer = consumer;
     _consumer.delegate = self;
     _credentialStore = credentialStore;
-    _context = context;
+    _credentialResponseHandler = credentialResponseHandler;
   }
   return self;
 }
@@ -115,11 +118,8 @@
 #pragma mark - CredentialListHandler
 
 - (void)navigationCancelButtonWasPressed:(UIButton*)button {
-  NSError* error =
-      [[NSError alloc] initWithDomain:ASExtensionErrorDomain
-                                 code:ASExtensionErrorCodeUserCanceled
-                             userInfo:nil];
-  [self.context cancelRequestWithError:error];
+  [self.credentialResponseHandler
+      userCancelledRequestWithErrorCode:ASExtensionErrorCodeUserCanceled];
 }
 
 - (void)userSelectedCredential:(id<Credential>)credential {
diff --git a/ios/chrome/credential_provider_extension/ui/credential_response_handler.h b/ios/chrome/credential_provider_extension/ui/credential_response_handler.h
new file mode 100644
index 0000000..0823d0ea
--- /dev/null
+++ b/ios/chrome/credential_provider_extension/ui/credential_response_handler.h
@@ -0,0 +1,24 @@
+// 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 IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_RESPONSE_HANDLER_H_
+#define IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_RESPONSE_HANDLER_H_
+
+#import <AuthenticationServices/AuthenticationServices.h>
+#import <UIKit/UIKit.h>
+
+// A handler to allow children to communicate selected credentials back to the
+// parent. This is essentially a wrapper for
+// `ASCredentialProviderExtensionContext` to force all calls through the parent.
+@protocol CredentialResponseHandler
+
+- (void)userSelectedCredential:(ASPasswordCredential*)credential;
+
+- (void)userCancelledRequestWithErrorCode:(ASExtensionErrorCode)errorCode;
+
+- (void)completeExtensionConfigurationRequest;
+
+@end
+
+#endif  // IOS_CHROME_CREDENTIAL_PROVIDER_EXTENSION_UI_CREDENTIAL_RESPONSE_HANDLER_H_
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
index 5f172a8..71a509e 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
+++ b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.h
@@ -7,9 +7,18 @@
 
 #import <UIKit/UIKit.h>
 
-@class ASCredentialProviderExtensionContext;
 @class ASCredentialServiceIdentifier;
+@protocol CredentialResponseHandler;
 @protocol CredentialStore;
+@class NewPasswordCoordinator;
+
+@protocol NewPasswordCoordinatorDelegate
+
+// Asks the delegate to stop this coordinator and dismiss it.
+- (void)dismissNewPasswordCoordinator:
+    (NewPasswordCoordinator*)newPasswordCoordinator;
+
+@end
 
 // The coordinator for the new password feature.
 @interface NewPasswordCoordinator : NSObject
@@ -18,14 +27,17 @@
 // `baseViewController`.
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
-                       context:(ASCredentialProviderExtensionContext*)context
             serviceIdentifiers:
                 (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
            existingCredentials:(id<CredentialStore>)existingCredentials
+     credentialResponseHandler:
+         (id<CredentialResponseHandler>)credentialResponseHandler
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
 
+@property(nonatomic, weak) id<NewPasswordCoordinatorDelegate> delegate;
+
 // Starts the feature.
 - (void)start;
 
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
index f0d4f75..39e49eea 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_coordinator.mm
@@ -25,9 +25,6 @@
 // The view controller of this coordinator.
 @property(nonatomic, strong) UINavigationController* viewController;
 
-// The extension context for the credential provider.
-@property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
-
 // The mediator for this coordinator.
 @property(nonatomic, strong) NewPasswordMediator* mediator;
 
@@ -39,22 +36,27 @@
 // exists.
 @property(nonatomic, weak) id<CredentialStore> existingCredentials;
 
+// The handler to use when a credential is selected.
+@property(nonatomic, weak) id<CredentialResponseHandler>
+    credentialResponseHandler;
+
 @end
 
 @implementation NewPasswordCoordinator
 
 - (instancetype)
     initWithBaseViewController:(UIViewController*)baseViewController
-                       context:(ASCredentialProviderExtensionContext*)context
             serviceIdentifiers:
                 (NSArray<ASCredentialServiceIdentifier*>*)serviceIdentifiers
-           existingCredentials:(id<CredentialStore>)existingCredentials {
+           existingCredentials:(id<CredentialStore>)existingCredentials
+     credentialResponseHandler:
+         (id<CredentialResponseHandler>)credentialResponseHandler {
   self = [super init];
   if (self) {
     _baseViewController = baseViewController;
-    _context = context;
     _serviceIdentifiers = serviceIdentifiers;
     _existingCredentials = existingCredentials;
+    _credentialResponseHandler = credentialResponseHandler;
   }
   return self;
 }
@@ -64,7 +66,7 @@
       initWithUserDefaults:app_group::GetGroupUserDefaults()
          serviceIdentifier:self.serviceIdentifiers.firstObject];
   self.mediator.existingCredentials = self.existingCredentials;
-  self.mediator.context = self.context;
+  self.mediator.credentialResponseHandler = self.credentialResponseHandler;
 
   NewPasswordViewController* newPasswordViewController =
       [[NewPasswordViewController alloc] init];
@@ -97,7 +99,7 @@
 
 - (void)navigationCancelButtonWasPressedInNewPasswordViewController:
     (NewPasswordViewController*)viewController {
-  [self.baseViewController dismissViewControllerAnimated:YES completion:nil];
+  [self.delegate dismissNewPasswordCoordinator:self];
 }
 
 @end
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator.h b/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
index 5d89a9f..baca2948 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator.h
@@ -10,7 +10,7 @@
 #import "ios/chrome/credential_provider_extension/ui/new_password_view_controller.h"
 
 @class ASCredentialServiceIdentifier;
-@class ASCredentialProviderExtensionContext;
+@protocol CredentialResponseHandler;
 @protocol CredentialStore;
 @protocol NewPasswordUIHandler;
 
@@ -35,8 +35,9 @@
 // UI handler to allow this mediator to ask the UI for any necessary updates.
 @property(nonatomic, weak) id<NewPasswordUIHandler> uiHandler;
 
-// The extension context for the credential provider.
-@property(nonatomic, weak) ASCredentialProviderExtensionContext* context;
+// The handler to use when a credential is selected or cancelled.
+@property(nonatomic, weak) id<CredentialResponseHandler>
+    credentialResponseHandler;
 
 @end
 
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
index f5137dd..63cfaee 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator.mm
@@ -19,6 +19,7 @@
 #import "ios/chrome/credential_provider_extension/metrics_util.h"
 #import "ios/chrome/credential_provider_extension/password_spec_fetcher_buildflags.h"
 #import "ios/chrome/credential_provider_extension/password_util.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/new_password_ui_handler.h"
 #import "ios/chrome/credential_provider_extension/ui/ui_util.h"
 #import "ios/components/credential_provider_extension/password_spec_fetcher.h"
@@ -168,8 +169,7 @@
   ASPasswordCredential* ASCredential =
       [ASPasswordCredential credentialWithUser:credential.user
                                       password:password];
-  [self.context completeRequestWithSelectedCredential:ASCredential
-                                    completionHandler:nil];
+  [self.credentialResponseHandler userSelectedCredential:ASCredential];
 }
 
 - (NSString*)currentIdentifier {
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm b/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
index 9071c17..c643efc5 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_mediator_unittest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/common/credential_provider/constants.h"
 #import "ios/chrome/common/credential_provider/user_defaults_credential_store.h"
 #import "ios/chrome/credential_provider_extension/password_util.h"
+#import "ios/chrome/credential_provider_extension/ui/credential_response_handler.h"
 #import "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
 #import "testing/platform_test.h"
@@ -51,30 +52,40 @@
 
 @end
 
-// Fake implementation of ASCredentialProviderExtensionContext so tests can
+// Fake implementation of CredentialResponseHandler so tests can
 // tell when a credential has been saved.
-@interface FakeExtensionContext : ASCredentialProviderExtensionContext
+@interface FakeCredentialResponseHandler : NSObject <CredentialResponseHandler>
 
 @property(nonatomic, strong) ASPasswordCredential* credential;
 
 @property(nonatomic, strong) void (^receivedCredentialBlock)();
 
+@property(nonatomic, assign) ASExtensionErrorCode errorCode;
+
+@property(nonatomic, strong) void (^receivedErrorCodeBlock)();
+
 @end
 
-@implementation FakeExtensionContext
+@implementation FakeCredentialResponseHandler
 
-- (void)completeRequestWithSelectedCredential:(ASPasswordCredential*)credential
-                            completionHandler:
-                                (void (^)(BOOL expired))completionHandler {
+- (void)userSelectedCredential:(ASPasswordCredential*)credential {
   self.credential = credential;
-  if (completionHandler) {
-    completionHandler(NO);
-  }
   if (self.receivedCredentialBlock) {
     self.receivedCredentialBlock();
   }
 }
 
+- (void)userCancelledRequestWithErrorCode:(ASExtensionErrorCode)errorCode {
+  self.errorCode = errorCode;
+  if (self.receivedErrorCodeBlock) {
+    self.receivedErrorCodeBlock();
+  }
+}
+
+- (void)completeExtensionConfigurationRequest {
+  // No-op.
+}
+
 @end
 
 namespace {
@@ -117,7 +128,8 @@
   id<MutableCredentialStore> store_;
   FakeNewPasswordUIHandler* uiHandler_ =
       [[FakeNewPasswordUIHandler alloc] init];
-  FakeExtensionContext* context_ = [[FakeExtensionContext alloc] init];
+  FakeCredentialResponseHandler* responseHandler_ =
+      [[FakeCredentialResponseHandler alloc] init];
 };
 
 void NewPasswordMediatorTest::SetUp() {
@@ -131,7 +143,7 @@
 
   mediator_.existingCredentials = store_;
   mediator_.uiHandler = uiHandler_;
-  mediator_.context = context_;
+  mediator_.credentialResponseHandler = responseHandler_;
 }
 
 void NewPasswordMediatorTest::TearDown() {
@@ -161,7 +173,7 @@
   NSString* testUsername = @"user";
   NSString* testPassword = @"password";
 
-  context_.receivedCredentialBlock = ^() {
+  responseHandler_.receivedCredentialBlock = ^() {
     blockWaitCompleted = YES;
   };
 
@@ -176,8 +188,8 @@
   EXPECT_FALSE(uiHandler_.alertedCredentialExists);
   EXPECT_FALSE(uiHandler_.alertedSaveFailed);
 
-  EXPECT_NSEQ(testUsername, context_.credential.user);
-  EXPECT_NSEQ(testPassword, context_.credential.password);
+  EXPECT_NSEQ(testUsername, responseHandler_.credential.user);
+  EXPECT_NSEQ(testPassword, responseHandler_.credential.password);
 
   // Reload the store from memory and check that the credential was added.
   NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
@@ -214,7 +226,7 @@
 
   // Store the originally created credential and that should update the existing
   // one.
-  context_.receivedCredentialBlock = ^() {
+  responseHandler_.receivedCredentialBlock = ^() {
     blockWaitCompleted = YES;
   };
 
@@ -244,8 +256,8 @@
   EXPECT_FALSE(uiHandler_.alertedCredentialExists);
   EXPECT_FALSE(uiHandler_.alertedSaveFailed);
 
-  EXPECT_NSEQ(testUsername, context_.credential.user);
-  EXPECT_NSEQ(testPassword, context_.credential.password);
+  EXPECT_NSEQ(testUsername, responseHandler_.credential.user);
+  EXPECT_NSEQ(testPassword, responseHandler_.credential.password);
 
   // Reload the store from memory and check that the credential was updated.
   NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
diff --git a/ios/chrome/credential_provider_extension/ui/new_password_table_cell.mm b/ios/chrome/credential_provider_extension/ui/new_password_table_cell.mm
index abf4163..dee93ea5 100644
--- a/ios/chrome/credential_provider_extension/ui/new_password_table_cell.mm
+++ b/ios/chrome/credential_provider_extension/ui/new_password_table_cell.mm
@@ -98,6 +98,7 @@
     [_textField addTarget:self
                    action:@selector(textFieldDidChange:)
          forControlEvents:UIControlEventEditingChanged];
+    _textField.autocorrectionType = UITextAutocorrectionTypeNo;
 
     _hidePasswordButton = [UIButton buttonWithType:UIButtonTypeSystem];
     _hidePasswordButton.translatesAutoresizingMaskIntoConstraints = NO;
diff --git a/ios/chrome/test/wpt/BUILD.gn b/ios/chrome/test/wpt/BUILD.gn
index 6502371..9fabec1 100644
--- a/ios/chrome/test/wpt/BUILD.gn
+++ b/ios/chrome/test/wpt/BUILD.gn
@@ -34,12 +34,17 @@
     "//.vpython3",
   ]
   data_deps = [
+    ":tools",
     "//testing:test_scripts_shared",
     "//third_party/catapult/third_party/typ:typ",
     "//tools/imagediff",
   ]
 }
 
+group("tools") {
+  data = [ "tools/" ]
+}
+
 group("all_tests") {
   testonly = true
   deps = [
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 74a53bed..62c46e34 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-19022b2de15af0295d8800e50e840af0d039c790
\ No newline at end of file
+5ff6bb8e66f26060c1c56033471b588d7e7b906e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 1e8be31d..86daf325 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-c7aea3454603b428923467d271ba99a81fef047d
\ No newline at end of file
+1f4d0378ca5e3c897031df040c0be80ee1e532ec
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index e355203f..ce8bcfec 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-70443326bdd3ddddedb5df04d6d95ffefb091e60
\ No newline at end of file
+629fd46b8d067d495e5a27eced353c9e285e556e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 8a346bb..c5921bb 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-310559caf75b4393598c6c903c836a9a162aca1b
\ No newline at end of file
+569296ee560406c8bb80f0c68d862a7986b1f358
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 4cba1ac..cf36a9f 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-24e7e91bdb5033fdf7801064a900996189556062
\ No newline at end of file
+b801afc93385353f049917af9d8a01d8fed325cc
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 2f65061..b315493 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-1c1362b84f640d2869e8a503d6487282c988174b
\ No newline at end of file
+c4f40dfed2e418fa0a8d3923012f603971c807c2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 615843c..f74f0bc 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-46700897de93456cb37352bad66237e44ff54230
\ No newline at end of file
+f00af7d83bff7ad1eed9a00328e96857451f78a2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 28e1ffb..9507f79 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-70e6578ecabb584bfc4d22306a3045680153957e
\ No newline at end of file
+e52de08761a6c06735e7ab18461fcfee59dcddc6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index de6222f..4a2ee6af 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-deb2df1b157a50cec82716f28a9c8c13f2f0977d
\ No newline at end of file
+1e865cf2da3113382532d8d0421443b585b32c14
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index f4e24dfb..b404791 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-7b03017379fa5c8d280d70815c752954252369af
\ No newline at end of file
+5be0491dc50ee02b5c5d133242289e3a9ebb1d1c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index cd504db5..b0009c2 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-0a5ef14dea8b4ff11444d81b6fb1e6d3d8c06d4b
\ No newline at end of file
+f80a645bf4d7f5c3519090a785ff631c35e10295
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 68108d3..b9230e18 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-7c1fe372b6f5b2c6899ec0919464365ec8a1fafe
\ No newline at end of file
+c4e06498071d9aa5105da0c75dc7e91fef81a4a4
\ No newline at end of file
diff --git a/ios/web/content/BUILD.gn b/ios/web/content/BUILD.gn
new file mode 100644
index 0000000..d2318f7e
--- /dev/null
+++ b/ios/web/content/BUILD.gn
@@ -0,0 +1,28 @@
+# 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("//build/config/features.gni")
+
+assert(use_blink, "Content is only supported in Blink builds.")
+
+source_set("content") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "js_messaging/content_web_frames_manager.h",
+    "js_messaging/content_web_frames_manager.mm",
+    "navigation/content_navigation_manager.h",
+    "navigation/content_navigation_manager.mm",
+    "web_state/content_web_state.h",
+    "web_state/content_web_state.mm",
+    "web_state/crc_web_view_proxy_impl.h",
+    "web_state/crc_web_view_proxy_impl.mm",
+  ]
+  deps = [
+    "//base",
+    "//build:blink_buildflags",
+    "//ios/web/public",
+    "//ios/web/public/favicon",
+    "//ios/web/public/js_messaging",
+  ]
+}
diff --git a/ios/web/content/js_messaging/content_web_frames_manager.h b/ios/web/content/js_messaging/content_web_frames_manager.h
new file mode 100644
index 0000000..00389b6
--- /dev/null
+++ b/ios/web/content/js_messaging/content_web_frames_manager.h
@@ -0,0 +1,35 @@
+// 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 IOS_WEB_CONTENT_JS_MESSAGING_CONTENT_WEB_FRAMES_MANAGER_H_
+#define IOS_WEB_CONTENT_JS_MESSAGING_CONTENT_WEB_FRAMES_MANAGER_H_
+
+#import "ios/web/public/js_messaging/web_frames_manager.h"
+
+#import "build/blink_buildflags.h"
+
+#if !BUILDFLAG(USE_BLINK)
+#error File can only be included when USE_BLINK is true
+#endif
+
+namespace web {
+
+// ContentWebFramesManager is a WebFramesManager that is built on top
+// of //content.
+class ContentWebFramesManager : public WebFramesManager {
+ public:
+  ContentWebFramesManager();
+  ~ContentWebFramesManager() override;
+
+  // WebFramesManager impl.
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
+  std::set<WebFrame*> GetAllWebFrames() override;
+  WebFrame* GetMainWebFrame() override;
+  WebFrame* GetFrameWithId(const std::string& frame_id) override;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_CONTENT_JS_MESSAGING_CONTENT_WEB_FRAMES_MANAGER_H_
diff --git a/ios/web/content/js_messaging/content_web_frames_manager.mm b/ios/web/content/js_messaging/content_web_frames_manager.mm
new file mode 100644
index 0000000..c334022
--- /dev/null
+++ b/ios/web/content/js_messaging/content_web_frames_manager.mm
@@ -0,0 +1,35 @@
+// 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 "ios/web/content/js_messaging/content_web_frames_manager.h"
+
+#import <set>
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace web {
+
+ContentWebFramesManager::ContentWebFramesManager() {}
+
+ContentWebFramesManager::~ContentWebFramesManager() {}
+
+void ContentWebFramesManager::AddObserver(Observer* observer) {}
+
+void ContentWebFramesManager::RemoveObserver(Observer* observer) {}
+
+std::set<WebFrame*> ContentWebFramesManager::GetAllWebFrames() {
+  return std::set<WebFrame*>();
+}
+
+WebFrame* ContentWebFramesManager::GetMainWebFrame() {
+  return nullptr;
+}
+
+WebFrame* ContentWebFramesManager::GetFrameWithId(const std::string& frame_id) {
+  return nullptr;
+}
+
+}  // namespace web
diff --git a/ios/web/content/navigation/content_navigation_manager.h b/ios/web/content/navigation/content_navigation_manager.h
new file mode 100644
index 0000000..67ae8eb
--- /dev/null
+++ b/ios/web/content/navigation/content_navigation_manager.h
@@ -0,0 +1,60 @@
+// 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 IOS_WEB_CONTENT_NAVIGATION_CONTENT_NAVIGATION_MANAGER_H_
+#define IOS_WEB_CONTENT_NAVIGATION_CONTENT_NAVIGATION_MANAGER_H_
+
+#import "ios/web/public/navigation/navigation_manager.h"
+
+#import "build/blink_buildflags.h"
+
+#if !BUILDFLAG(USE_BLINK)
+#error File can only be included when USE_BLINK is true
+#endif
+
+namespace web {
+
+// ContentNavigationManager is a NavigationManager implementation that
+// is built on top of //content's NavigationController.
+class ContentNavigationManager : public NavigationManager {
+ public:
+  ContentNavigationManager(BrowserState* browser_state);
+  ~ContentNavigationManager() override;
+  BrowserState* GetBrowserState() const override;
+  WebState* GetWebState() const override;
+  NavigationItem* GetVisibleItem() const override;
+  NavigationItem* GetLastCommittedItem() const override;
+  NavigationItem* GetPendingItem() const override;
+  void DiscardNonCommittedItems() override;
+  void LoadURLWithParams(const NavigationManager::WebLoadParams&) override;
+  void LoadIfNecessary() override;
+  void AddTransientURLRewriter(
+      BrowserURLRewriter::URLRewriter rewriter) override;
+  int GetItemCount() const override;
+  NavigationItem* GetItemAtIndex(size_t index) const override;
+  int GetIndexOfItem(const NavigationItem* item) const override;
+  int GetPendingItemIndex() const override;
+  int GetLastCommittedItemIndex() const override;
+  bool CanGoBack() const override;
+  bool CanGoForward() const override;
+  bool CanGoToOffset(int offset) const override;
+  void GoBack() override;
+  void GoForward() override;
+  void GoToIndex(int index) override;
+  void Reload(ReloadType reload_type, bool check_for_reposts) override;
+  void ReloadWithUserAgentType(UserAgentType user_agent_type) override;
+  std::vector<NavigationItem*> GetBackwardItems() const override;
+  std::vector<NavigationItem*> GetForwardItems() const override;
+  void Restore(int last_committed_item_index,
+               std::vector<std::unique_ptr<NavigationItem>> items) override;
+  bool IsRestoreSessionInProgress() const override;
+  void AddRestoreCompletionCallback(base::OnceClosure callback) override;
+
+ private:
+  BrowserState* browser_state_;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_CONTENT_NAVIGATION_CONTENT_NAVIGATION_MANAGER_H_
diff --git a/ios/web/content/navigation/content_navigation_manager.mm b/ios/web/content/navigation/content_navigation_manager.mm
new file mode 100644
index 0000000..e8809dfb
--- /dev/null
+++ b/ios/web/content/navigation/content_navigation_manager.mm
@@ -0,0 +1,112 @@
+// 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 "ios/web/content/navigation/content_navigation_manager.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace web {
+
+ContentNavigationManager::ContentNavigationManager(BrowserState* browser_state)
+    : browser_state_(browser_state) {}
+
+ContentNavigationManager::~ContentNavigationManager() {}
+
+BrowserState* ContentNavigationManager::GetBrowserState() const {
+  return browser_state_;
+}
+
+WebState* ContentNavigationManager::GetWebState() const {
+  return nullptr;
+}
+
+NavigationItem* ContentNavigationManager::GetVisibleItem() const {
+  return nullptr;
+}
+
+NavigationItem* ContentNavigationManager::GetLastCommittedItem() const {
+  return nullptr;
+}
+
+NavigationItem* ContentNavigationManager::GetPendingItem() const {
+  return nullptr;
+}
+
+void ContentNavigationManager::DiscardNonCommittedItems() {}
+
+void ContentNavigationManager::LoadURLWithParams(
+    const NavigationManager::WebLoadParams&) {}
+
+void ContentNavigationManager::LoadIfNecessary() {}
+
+void ContentNavigationManager::AddTransientURLRewriter(
+    BrowserURLRewriter::URLRewriter rewriter) {}
+
+int ContentNavigationManager::GetItemCount() const {
+  return 0;
+}
+
+NavigationItem* ContentNavigationManager::GetItemAtIndex(size_t index) const {
+  return nullptr;
+}
+
+int ContentNavigationManager::GetIndexOfItem(const NavigationItem* item) const {
+  return 0;
+}
+
+int ContentNavigationManager::GetPendingItemIndex() const {
+  return 0;
+}
+
+int ContentNavigationManager::GetLastCommittedItemIndex() const {
+  return 0;
+}
+
+bool ContentNavigationManager::CanGoBack() const {
+  return false;
+}
+
+bool ContentNavigationManager::CanGoForward() const {
+  return false;
+}
+
+bool ContentNavigationManager::CanGoToOffset(int offset) const {
+  return false;
+}
+
+void ContentNavigationManager::GoBack() {}
+
+void ContentNavigationManager::GoForward() {}
+
+void ContentNavigationManager::GoToIndex(int index) {}
+
+void ContentNavigationManager::Reload(ReloadType reload_type,
+                                      bool check_for_reposts) {}
+
+void ContentNavigationManager::ReloadWithUserAgentType(
+    UserAgentType user_agent_type) {}
+
+std::vector<NavigationItem*> ContentNavigationManager::GetBackwardItems()
+    const {
+  return std::vector<NavigationItem*>();
+}
+
+std::vector<NavigationItem*> ContentNavigationManager::GetForwardItems() const {
+  return std::vector<NavigationItem*>();
+}
+
+void ContentNavigationManager::Restore(
+    int last_committed_item_index,
+    std::vector<std::unique_ptr<NavigationItem>> items) {}
+
+bool ContentNavigationManager::IsRestoreSessionInProgress() const {
+  return false;
+}
+
+void ContentNavigationManager::AddRestoreCompletionCallback(
+    base::OnceClosure callback) {}
+
+}  // namespace web
diff --git a/ios/web/content/web_state/content_web_state.h b/ios/web/content/web_state/content_web_state.h
new file mode 100644
index 0000000..2637436
--- /dev/null
+++ b/ios/web/content/web_state/content_web_state.h
@@ -0,0 +1,126 @@
+// 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 IOS_WEB_CONTENT_WEB_STATE_CONTENT_WEB_STATE_H_
+#define IOS_WEB_CONTENT_WEB_STATE_CONTENT_WEB_STATE_H_
+
+#import "ios/web/public/web_state.h"
+
+#import <memory>
+
+#import <UIKit/UIKit.h>
+
+#import "build/blink_buildflags.h"
+#import "ios/web/content/js_messaging/content_web_frames_manager.h"
+#import "ios/web/content/navigation/content_navigation_manager.h"
+
+@class CRWWebViewProxy;
+
+#if !BUILDFLAG(USE_BLINK)
+#error File can only be included when USE_BLINK is true
+#endif
+
+namespace web {
+
+// ContentWebState is an implementation of WebState that's based on WebContents.
+class ContentWebState : public WebState {
+ public:
+  explicit ContentWebState(const CreateParams& params);
+  ~ContentWebState() override;
+
+  // WebState implementation.
+  WebStateDelegate* GetDelegate() override;
+  void SetDelegate(WebStateDelegate* delegate) override;
+  bool IsRealized() const final;
+  WebState* ForceRealized() final;
+  bool IsWebUsageEnabled() const override;
+  void SetWebUsageEnabled(bool enabled) override;
+  UIView* GetView() override;
+  void DidCoverWebContent() override;
+  void DidRevealWebContent() override;
+  base::Time GetLastActiveTime() const final;
+  base::Time GetCreationTime() const final;
+  void WasShown() override;
+  void WasHidden() override;
+  void SetKeepRenderProcessAlive(bool keep_alive) override;
+  BrowserState* GetBrowserState() const override;
+  base::WeakPtr<WebState> GetWeakPtr() override;
+  void OpenURL(const OpenURLParams& params) override;
+  void LoadSimulatedRequest(const GURL& url,
+                            NSString* response_html_string) override
+      API_AVAILABLE(ios(15.0));
+  void LoadSimulatedRequest(const GURL& url,
+                            NSData* response_data,
+                            NSString* mime_type) override
+      API_AVAILABLE(ios(15.0));
+  void Stop() override;
+  const NavigationManager* GetNavigationManager() const override;
+  NavigationManager* GetNavigationManager() override;
+  const WebFramesManager* GetPageWorldWebFramesManager() const override;
+  WebFramesManager* GetPageWorldWebFramesManager() override;
+  const SessionCertificatePolicyCache* GetSessionCertificatePolicyCache()
+      const override;
+  SessionCertificatePolicyCache* GetSessionCertificatePolicyCache() override;
+  CRWSessionStorage* BuildSessionStorage() override;
+  void LoadData(NSData* data, NSString* mime_type, const GURL& url) override;
+  void ExecuteUserJavaScript(NSString* javaScript) override;
+  NSString* GetStableIdentifier() const override;
+  const std::string& GetContentsMimeType() const override;
+  bool ContentIsHTML() const override;
+  const std::u16string& GetTitle() const override;
+  bool IsLoading() const override;
+  double GetLoadingProgress() const override;
+  bool IsVisible() const override;
+  bool IsCrashed() const override;
+  bool IsEvicted() const override;
+  bool IsBeingDestroyed() const override;
+  bool IsWebPageInFullscreenMode() const override;
+  const FaviconStatus& GetFaviconStatus() const final;
+  void SetFaviconStatus(const FaviconStatus& favicon_status) final;
+  int GetNavigationItemCount() const override;
+  const GURL& GetVisibleURL() const override;
+  const GURL& GetLastCommittedURL() const override;
+  GURL GetCurrentURL(URLVerificationTrustLevel* trust_level) const override;
+  CRWWebViewProxyType GetWebViewProxy() const override;
+  void AddObserver(WebStateObserver* observer) override;
+  void RemoveObserver(WebStateObserver* observer) override;
+  void CloseWebState() override;
+  bool SetSessionStateData(NSData* data) override;
+  NSData* SessionStateData() override;
+  PermissionState GetStateForPermission(Permission permission) const override
+      API_AVAILABLE(ios(15.0));
+  void SetStateForPermission(PermissionState state,
+                             Permission permission) override
+      API_AVAILABLE(ios(15.0));
+  NSDictionary<NSNumber*, NSNumber*>* GetStatesForAllPermissions()
+      const override API_AVAILABLE(ios(15.0));
+  void DownloadCurrentPage(NSString* destination_file,
+                           id<CRWWebViewDownloadDelegate> delegate,
+                           void (^handler)(id<CRWWebViewDownload>)) override
+      API_AVAILABLE(ios(14.5));
+  bool IsFindInteractionSupported() final;
+  bool IsFindInteractionEnabled() final;
+  void SetFindInteractionEnabled(bool enabled) final;
+  id<CRWFindInteraction> GetFindInteraction() final API_AVAILABLE(ios(16));
+  id GetActivityItem() API_AVAILABLE(ios(16.4)) final;
+  void AddPolicyDecider(WebStatePolicyDecider* decider) override;
+  void RemovePolicyDecider(WebStatePolicyDecider* decider) override;
+  void DidChangeVisibleSecurityState() override;
+  bool HasOpener() const override;
+  void SetHasOpener(bool has_opener) override;
+  bool CanTakeSnapshot() const override;
+  void TakeSnapshot(const gfx::RectF& rect, SnapshotCallback callback) override;
+  void CreateFullPagePdf(base::OnceCallback<void(NSData*)> callback) override;
+  void CloseMediaPresentations() override;
+
+ private:
+  UIScrollView* web_view_;
+  id<CRWWebViewProxy> web_view_proxy_;
+  std::unique_ptr<ContentNavigationManager> navigation_manager_;
+  std::unique_ptr<ContentWebFramesManager> web_frames_manager_;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_CONTENT_WEB_STATE_CONTENT_WEB_STATE_H_
diff --git a/ios/web/content/web_state/content_web_state.mm b/ios/web/content/web_state/content_web_state.mm
new file mode 100644
index 0000000..d54b0fd
--- /dev/null
+++ b/ios/web/content/web_state/content_web_state.mm
@@ -0,0 +1,280 @@
+// 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 "ios/web/content/web_state/content_web_state.h"
+
+#import "base/strings/utf_string_conversions.h"
+#import "ios/web/content/web_state/crc_web_view_proxy_impl.h"
+#import "ios/web/public/favicon/favicon_status.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace web {
+
+ContentWebState::ContentWebState(const CreateParams& params) {
+  navigation_manager_ =
+      std::make_unique<ContentNavigationManager>(params.browser_state);
+  web_frames_manager_ = std::make_unique<ContentWebFramesManager>();
+
+  web_view_ = [[UIScrollView alloc] init];
+  web_view_.translatesAutoresizingMaskIntoConstraints = NO;
+  web_view_.backgroundColor = UIColor.redColor;
+
+  CRCWebViewProxyImpl* proxy = [[CRCWebViewProxyImpl alloc] init];
+  proxy.contentView = web_view_;
+  web_view_proxy_ = proxy;
+}
+
+ContentWebState::~ContentWebState() {}
+
+WebStateDelegate* ContentWebState::GetDelegate() {
+  return nullptr;
+}
+
+void ContentWebState::SetDelegate(WebStateDelegate* delegate) {}
+
+bool ContentWebState::IsRealized() const {
+  return true;
+}
+
+WebState* ContentWebState::ForceRealized() {
+  return this;
+}
+
+bool ContentWebState::IsWebUsageEnabled() const {
+  return true;
+}
+
+void ContentWebState::SetWebUsageEnabled(bool enabled) {}
+
+UIView* ContentWebState::GetView() {
+  return web_view_;
+}
+
+void ContentWebState::DidCoverWebContent() {}
+
+void ContentWebState::DidRevealWebContent() {}
+
+base::Time ContentWebState::GetLastActiveTime() const {
+  return base::Time::Now();
+}
+
+base::Time ContentWebState::GetCreationTime() const {
+  return base::Time::Now();
+}
+
+void ContentWebState::WasShown() {}
+
+void ContentWebState::WasHidden() {}
+
+void ContentWebState::SetKeepRenderProcessAlive(bool keep_alive) {}
+
+BrowserState* ContentWebState::GetBrowserState() const {
+  return navigation_manager_->GetBrowserState();
+}
+
+base::WeakPtr<WebState> ContentWebState::GetWeakPtr() {
+  return nullptr;
+}
+
+void ContentWebState::OpenURL(const OpenURLParams& params) {}
+
+void ContentWebState::LoadSimulatedRequest(const GURL& url,
+                                           NSString* response_html_string) {}
+
+void ContentWebState::LoadSimulatedRequest(const GURL& url,
+                                           NSData* response_data,
+                                           NSString* mime_type) {}
+
+void ContentWebState::Stop() {}
+
+const NavigationManager* ContentWebState::GetNavigationManager() const {
+  return navigation_manager_.get();
+}
+
+NavigationManager* ContentWebState::GetNavigationManager() {
+  return navigation_manager_.get();
+}
+
+const WebFramesManager* ContentWebState::GetPageWorldWebFramesManager() const {
+  return web_frames_manager_.get();
+}
+
+WebFramesManager* ContentWebState::GetPageWorldWebFramesManager() {
+  return web_frames_manager_.get();
+}
+
+const SessionCertificatePolicyCache*
+ContentWebState::GetSessionCertificatePolicyCache() const {
+  return nullptr;
+}
+
+SessionCertificatePolicyCache*
+ContentWebState::GetSessionCertificatePolicyCache() {
+  return nullptr;
+}
+
+CRWSessionStorage* ContentWebState::BuildSessionStorage() {
+  return nil;
+}
+
+void ContentWebState::LoadData(NSData* data,
+                               NSString* mime_type,
+                               const GURL& url) {}
+
+void ContentWebState::ExecuteUserJavaScript(NSString* javaScript) {}
+
+NSString* ContentWebState::GetStableIdentifier() const {
+  return @"content";
+}
+
+const std::string& ContentWebState::GetContentsMimeType() const {
+  static std::string type = "text/html";
+  return type;
+}
+
+bool ContentWebState::ContentIsHTML() const {
+  return true;
+}
+
+const std::u16string& ContentWebState::GetTitle() const {
+  static std::u16string title = u"Content";
+  return title;
+}
+
+bool ContentWebState::IsLoading() const {
+  return false;
+}
+
+double ContentWebState::GetLoadingProgress() const {
+  return 0.75;
+}
+
+bool ContentWebState::IsVisible() const {
+  return true;
+}
+
+bool ContentWebState::IsCrashed() const {
+  return false;
+}
+
+bool ContentWebState::IsEvicted() const {
+  return false;
+}
+
+bool ContentWebState::IsBeingDestroyed() const {
+  return false;
+}
+
+bool ContentWebState::IsWebPageInFullscreenMode() const {
+  return false;
+}
+
+const FaviconStatus& ContentWebState::GetFaviconStatus() const {
+  static FaviconStatus status;
+  return status;
+}
+
+void ContentWebState::SetFaviconStatus(const FaviconStatus& favicon_status) {}
+
+int ContentWebState::GetNavigationItemCount() const {
+  return 0;
+}
+
+const GURL& ContentWebState::GetVisibleURL() const {
+  static GURL url("https://www.chromium.org/blink");
+  return url;
+}
+
+const GURL& ContentWebState::GetLastCommittedURL() const {
+  static GURL url("https://https://www.chromium.org/blink");
+  return url;
+}
+
+GURL ContentWebState::GetCurrentURL(
+    URLVerificationTrustLevel* trust_level) const {
+  static GURL url("https://https://www.chromium.org/blink");
+  return url;
+}
+
+CRWWebViewProxyType ContentWebState::GetWebViewProxy() const {
+  return web_view_proxy_;
+}
+
+void ContentWebState::AddObserver(WebStateObserver* observer) {}
+
+void ContentWebState::RemoveObserver(WebStateObserver* observer) {}
+
+void ContentWebState::CloseWebState() {}
+
+bool ContentWebState::SetSessionStateData(NSData* data) {
+  return false;
+}
+
+NSData* ContentWebState::SessionStateData() {
+  return nil;
+}
+
+PermissionState ContentWebState::GetStateForPermission(
+    Permission permission) const {
+  return PermissionState();
+}
+
+void ContentWebState::SetStateForPermission(PermissionState state,
+                                            Permission permission) {}
+
+NSDictionary<NSNumber*, NSNumber*>*
+ContentWebState::GetStatesForAllPermissions() const {
+  return nil;
+}
+
+void ContentWebState::DownloadCurrentPage(
+    NSString* destination_file,
+    id<CRWWebViewDownloadDelegate> delegate,
+    void (^handler)(id<CRWWebViewDownload>)) {}
+
+bool ContentWebState::IsFindInteractionSupported() {
+  return false;
+}
+
+bool ContentWebState::IsFindInteractionEnabled() {
+  return false;
+}
+
+void ContentWebState::SetFindInteractionEnabled(bool enabled) {}
+
+id<CRWFindInteraction> ContentWebState::GetFindInteraction() {
+  return nil;
+}
+
+id ContentWebState::GetActivityItem() {
+  return nil;
+}
+
+void ContentWebState::AddPolicyDecider(WebStatePolicyDecider* decider) {}
+
+void ContentWebState::RemovePolicyDecider(WebStatePolicyDecider* decider) {}
+
+void ContentWebState::DidChangeVisibleSecurityState() {}
+
+bool ContentWebState::HasOpener() const {
+  return false;
+}
+
+void ContentWebState::SetHasOpener(bool has_opener) {}
+
+bool ContentWebState::CanTakeSnapshot() const {
+  return false;
+}
+
+void ContentWebState::TakeSnapshot(const gfx::RectF& rect,
+                                   SnapshotCallback callback) {}
+
+void ContentWebState::CreateFullPagePdf(base::OnceCallback<void(NSData*)>) {}
+
+void ContentWebState::CloseMediaPresentations() {}
+
+}  // namespace web
diff --git a/ios/web/content/web_state/crc_web_view_proxy_impl.h b/ios/web/content/web_state/crc_web_view_proxy_impl.h
new file mode 100644
index 0000000..30839a61
--- /dev/null
+++ b/ios/web/content/web_state/crc_web_view_proxy_impl.h
@@ -0,0 +1,26 @@
+// 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 IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEW_PROXY_IMPL_H_
+#define IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEW_PROXY_IMPL_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+
+#import "build/blink_buildflags.h"
+
+#if !BUILDFLAG(USE_BLINK)
+#error File can only be included when USE_BLINK is true
+#endif
+
+@interface CRCWebViewProxyImpl : NSObject <CRWWebViewProxy>
+
+@property(nonatomic, weak) UIScrollView* contentView;
+
+- (instancetype)init;
+
+@end
+
+#endif  // IOS_WEB_CONTENT_WEB_STATE_CRC_WEB_VIEW_PROXY_IMPL_H_
diff --git a/ios/web/content/web_state/crc_web_view_proxy_impl.mm b/ios/web/content/web_state/crc_web_view_proxy_impl.mm
new file mode 100644
index 0000000..fe16a32
--- /dev/null
+++ b/ios/web/content/web_state/crc_web_view_proxy_impl.mm
@@ -0,0 +1,147 @@
+// 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 "ios/web/content/web_state/crc_web_view_proxy_impl.h"
+
+#import "base/check.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+// TODO(crbug.com/1419001): These methods are defined in
+// crw_web_view_proxy_impl.h. Move them out of the category and into
+// the main class.
+@interface CRWWebViewScrollViewProxy (ForwardDeclares)
+- (void)cr_addInsets:(UIEdgeInsets)insets;
+- (void)cr_removeInsets:(UIEdgeInsets)insets;
+@end
+
+@implementation CRCWebViewProxyImpl {
+  NSMutableDictionary* _registeredInsets;
+  // The WebViewScrollViewProxy is a wrapper around the UIScrollView
+  // to give components access in a limited and controlled manner.
+  CRWWebViewScrollViewProxy* _contentViewScrollViewProxy;
+}
+@synthesize contentView = _contentView;
+
+- (instancetype)init {
+  self = [super init];
+  if (self) {
+    _registeredInsets = [[NSMutableDictionary alloc] init];
+    _contentViewScrollViewProxy = [[CRWWebViewScrollViewProxy alloc] init];
+  }
+  return self;
+}
+
+- (CRWWebViewScrollViewProxy*)scrollViewProxy {
+  return _contentViewScrollViewProxy;
+}
+
+- (BOOL)allowsBackForwardNavigationGestures {
+  return NO;
+}
+
+- (void)setAllowsBackForwardNavigationGestures:
+    (BOOL)allowsBackForwardNavigationGestures {
+}
+
+- (CGRect)bounds {
+  return [_contentView bounds];
+}
+
+- (CGRect)frame {
+  return [_contentView frame];
+}
+
+- (CGPoint)contentOffset {
+  return _contentView.contentOffset;
+}
+
+- (void)setContentOffset:(CGPoint)contentOffset {
+  _contentView.contentOffset = contentOffset;
+}
+
+- (UIEdgeInsets)contentInset {
+  return _contentView.contentInset;
+}
+
+- (void)setContentInset:(UIEdgeInsets)contentInset {
+  _contentView.contentInset = contentInset;
+}
+
+- (NSArray*)gestureRecognizers {
+  return [_contentView gestureRecognizers];
+}
+
+- (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer {
+  [_contentView addGestureRecognizer:gestureRecognizer];
+}
+
+- (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer {
+  [_contentView removeGestureRecognizer:gestureRecognizer];
+}
+
+- (BOOL)shouldUseViewContentInset {
+  return NO;
+}
+
+- (void)setShouldUseViewContentInset:(BOOL)shouldUseViewContentInset {
+}
+
+- (void)registerInsets:(UIEdgeInsets)insets forCaller:(id)caller {
+  NSValue* callerValue = [NSValue valueWithNonretainedObject:caller];
+  if ([_registeredInsets objectForKey:callerValue]) {
+    [self unregisterInsetsForCaller:caller];
+  }
+  [self.scrollViewProxy cr_addInsets:insets];
+  [_registeredInsets setObject:[NSValue valueWithUIEdgeInsets:insets]
+                        forKey:callerValue];
+}
+
+- (void)unregisterInsetsForCaller:(id)caller {
+  NSValue* callerValue = [NSValue valueWithNonretainedObject:caller];
+  NSValue* insetsValue = [_registeredInsets objectForKey:callerValue];
+  [self.scrollViewProxy cr_removeInsets:[insetsValue UIEdgeInsetsValue]];
+  [_registeredInsets removeObjectForKey:callerValue];
+}
+
+- (void)setContentView:(UIScrollView*)contentView {
+  DCHECK(contentView);
+  _contentView = contentView;
+  [_contentViewScrollViewProxy setScrollView:contentView];
+}
+
+- (void)clearContentViewAndAddPlaceholder:(BOOL)addPlaceholder {
+  _contentView = nil;
+  if (addPlaceholder) {
+    [_contentViewScrollViewProxy setScrollView:nil];
+  }
+}
+
+- (void)addSubview:(UIView*)view {
+  return [_contentView addSubview:view];
+}
+
+- (UIView*)keyboardAccessory {
+  return nil;
+}
+
+- (BOOL)becomeFirstResponder {
+  return [_contentView becomeFirstResponder];
+}
+
+- (void)surfaceSizeChanged {
+}
+
+- (void)showMenuWithItems:(NSArray<CRWContextMenuItem*>*)items
+                     rect:(CGRect)rect {
+}
+
+- (BOOL)isWebPageInFullscreenMode {
+  return NO;
+}
+
+@end
diff --git a/ios/web/web_state/BUILD.gn b/ios/web/web_state/BUILD.gn
index 40ffad1..17038f3 100644
--- a/ios/web/web_state/BUILD.gn
+++ b/ios/web/web_state/BUILD.gn
@@ -9,6 +9,7 @@
     ":policy_decision_state_tracker",
     ":web_state_impl_header",
     "//base",
+    "//build:blink_buildflags",
     "//ios/third_party/webkit",
     "//ios/web/common",
     "//ios/web/js_messaging",
@@ -33,6 +34,10 @@
     "//ui/gfx",
   ]
 
+  if (use_blink) {
+    deps += [ "//ios/web/content" ]
+  }
+
   sources = [
     "global_web_state_event_tracker.h",
     "global_web_state_event_tracker.mm",
diff --git a/ios/web/web_state/web_state_factory.mm b/ios/web/web_state/web_state_factory.mm
index 048334c..106d089 100644
--- a/ios/web/web_state/web_state_factory.mm
+++ b/ios/web/web_state/web_state_factory.mm
@@ -6,8 +6,13 @@
 
 #import <memory>
 
+#import "build/blink_buildflags.h"
 #import "ios/web/web_state/web_state_impl.h"
 
+#if BUILDFLAG(USE_BLINK)
+#import "ios/web/content/web_state/content_web_state.h"
+#endif  // USE_BLINK
+
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
@@ -16,7 +21,11 @@
 
 /* static */
 std::unique_ptr<WebState> WebState::Create(const CreateParams& params) {
+#if BUILDFLAG(USE_BLINK)
+  return std::make_unique<ContentWebState>(params);
+#else
   return std::make_unique<WebStateImpl>(params);
+#endif  // USE_BLINK
 }
 
 /* static */
@@ -24,7 +33,11 @@
     const CreateParams& params,
     CRWSessionStorage* session_storage) {
   DCHECK(session_storage);
+#if BUILDFLAG(USE_BLINK)
+  return std::make_unique<ContentWebState>(params);
+#else
   return std::make_unique<WebStateImpl>(params, session_storage);
+#endif  // USE_BLINK
 }
 
 }  // namespace web
diff --git a/media/base/async_destroy_video_encoder.h b/media/base/async_destroy_video_encoder.h
index 39ae18ac..6b77a4c 100644
--- a/media/base/async_destroy_video_encoder.h
+++ b/media/base/async_destroy_video_encoder.h
@@ -47,10 +47,10 @@
   }
 
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& options,
               EncoderStatusCB done_cb) override {
     DCHECK(wrapped_encoder_);
-    wrapped_encoder_->Encode(std::move(frame), key_frame, std::move(done_cb));
+    wrapped_encoder_->Encode(std::move(frame), options, std::move(done_cb));
   }
 
   void ChangeOptions(const Options& options,
diff --git a/media/base/bitrate.cc b/media/base/bitrate.cc
index d2ae94b..cf90edbb 100644
--- a/media/base/bitrate.cc
+++ b/media/base/bitrate.cc
@@ -14,6 +14,11 @@
   return Bitrate(Mode::kVariable, target_bps, peak_bps);
 }
 
+// static
+Bitrate Bitrate::ExternalRateControl() {
+  return Bitrate(Mode::kExternal, 0, 0);
+}
+
 bool Bitrate::operator==(const Bitrate& right) const {
   return (this->mode_ == right.mode_) &&
          (this->target_bps_ == right.target_bps_) &&
@@ -36,6 +41,8 @@
     case Mode::kVariable:
       return base::StringPrintf("VBR: target %d bps, peak %d bps", target_bps_,
                                 peak_bps_);
+    case Mode::kExternal:
+      return base::StringPrintf("External");
   }
 }
 
diff --git a/media/base/bitrate.h b/media/base/bitrate.h
index a99075a..d31fac2 100644
--- a/media/base/bitrate.h
+++ b/media/base/bitrate.h
@@ -14,9 +14,12 @@
 
 class MEDIA_EXPORT Bitrate {
  public:
-  // Indicates whether constant bitrate (CBR) or variable bitrate (VBR) should
-  // be used for encoding.
-  enum class Mode { kConstant, kVariable };
+  // Indicates whether
+  // - constant bitrate (CBR)
+  // - variable bitrate (VBR)
+  // - or external rate control
+  // should be used for encoding.
+  enum class Mode { kConstant, kVariable, kExternal };
 
   // Required by Mojo for serialization and de-serialization. Creates an
   // invalid constant bitrate with |target_| and |peak_| set to 0u. Prefer
@@ -34,6 +37,7 @@
     return Bitrate(Mode::kConstant, target_bps, 0);
   }
   static Bitrate VariableBitrate(uint32_t target_bps, uint32_t peak_bps);
+  static Bitrate ExternalRateControl();
 
   // Deleted variants: you must SAFELY convert to uint32_t before calling.
   // See base/numerics/safe_conversions.h for functions to safely convert
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 9a0f822d..c9d37d7 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -350,7 +350,7 @@
   MOCK_METHOD(void,
               Encode,
               (scoped_refptr<VideoFrame> frame,
-               bool key_frame,
+               const EncodeOptions& encode_options,
                EncoderStatusCB done_cb),
               (override));
 
diff --git a/media/base/video_bitrate_allocation.cc b/media/base/video_bitrate_allocation.cc
index 55894edc..4050b9e 100644
--- a/media/base/video_bitrate_allocation.cc
+++ b/media/base/video_bitrate_allocation.cc
@@ -23,6 +23,8 @@
       return media::Bitrate::ConstantBitrate(target_bps);
     case media::Bitrate::Mode::kVariable:
       return media::Bitrate::VariableBitrate(target_bps, peak_bps);
+    case media::Bitrate::Mode::kExternal:
+      return media::Bitrate::ExternalRateControl();
   }
 }
 
@@ -43,6 +45,11 @@
       // Bitrate.
       sum_bitrate_ = Bitrate::VariableBitrate(0u, 1u);
       break;
+    case Bitrate::Mode::kExternal:
+      // For variable bitrates, the peak must not be zero as enforced by
+      // Bitrate.
+      sum_bitrate_ = Bitrate::ExternalRateControl();
+      break;
   }
 }
 
@@ -151,6 +158,9 @@
     case Bitrate::Mode::kVariable:
       ss << "VBR with peak bps " << sum_bitrate_.peak_bps();
       break;
+    case Bitrate::Mode::kExternal:
+      ss << "External rate control";
+      break;
   }
   return ss.str();
 }
diff --git a/media/base/video_encoder.cc b/media/base/video_encoder.cc
index 20817f1d..7334eff3 100644
--- a/media/base/video_encoder.cc
+++ b/media/base/video_encoder.cc
@@ -42,6 +42,12 @@
 VideoEncoder::PendingEncode::PendingEncode(PendingEncode&&) = default;
 VideoEncoder::PendingEncode::~PendingEncode() = default;
 
+VideoEncoder::EncodeOptions::EncodeOptions(bool key_frame)
+    : key_frame(key_frame) {}
+VideoEncoder::EncodeOptions::EncodeOptions() = default;
+VideoEncoder::EncodeOptions::EncodeOptions(const EncodeOptions&) = default;
+VideoEncoder::EncodeOptions::~EncodeOptions() = default;
+
 void VideoEncoder::DisablePostedCallbacks() {
   post_callbacks_ = false;
 }
diff --git a/media/base/video_encoder.h b/media/base/video_encoder.h
index 557c566..5bc4b68 100644
--- a/media/base/video_encoder.h
+++ b/media/base/video_encoder.h
@@ -81,6 +81,17 @@
     HevcOptions hevc;
   };
 
+  struct MEDIA_EXPORT EncodeOptions {
+    explicit EncodeOptions(bool key_frame);
+    EncodeOptions();
+    EncodeOptions(const EncodeOptions&);
+    ~EncodeOptions();
+    bool key_frame;
+    // Per-frame codec-specific quantizer value.
+    // Should only be used when encoder configured with kExternal bitrate mode.
+    absl::optional<double> quantizer;
+  };
+
   // A sequence of codec specific bytes, commonly known as extradata.
   // If available, it should be given to the decoder as part of the
   // decoder config.
@@ -106,7 +117,7 @@
     ~PendingEncode();
     EncoderStatusCB done_callback;
     scoped_refptr<VideoFrame> frame;
-    bool key_frame;
+    EncodeOptions options;
   };
 
   VideoEncoder();
@@ -140,7 +151,7 @@
   // Encode() does not expect EOS frames, use Flush() to finalize the stream
   // and harvest the outputs.
   virtual void Encode(scoped_refptr<VideoFrame> frame,
-                      bool key_frame,
+                      const EncodeOptions& options,
                       EncoderStatusCB done_cb) = 0;
 
   // Adjust encoder options and the output callback for future frames, executing
diff --git a/media/filters/android/video_frame_extractor_unittest.cc b/media/filters/android/video_frame_extractor_unittest.cc
index 31dc97c..af11ca0 100644
--- a/media/filters/android/video_frame_extractor_unittest.cc
+++ b/media/filters/android/video_frame_extractor_unittest.cc
@@ -88,7 +88,7 @@
 TEST_F(VideoFrameExtractorTest, ExtractInvalidVideoFile) {
   // Creates a dummy video file, frame extraction should fail.
   base::FilePath file = temp_dir().AppendASCII("test.txt");
-  EXPECT_GT(base::WriteFile(file, "123", sizeof("123")), 0);
+  EXPECT_TRUE(base::WriteFile(file, "123"));
 
   auto result = ExtractFrame(file);
   EXPECT_FALSE(result.success);
diff --git a/media/gpu/android/ndk_video_encode_accelerator.cc b/media/gpu/android/ndk_video_encode_accelerator.cc
index aacb226e..8fea68b 100644
--- a/media/gpu/android/ndk_video_encode_accelerator.cc
+++ b/media/gpu/android/ndk_video_encode_accelerator.cc
@@ -349,7 +349,7 @@
   DCHECK(media_codec_);
   VideoEncoder::PendingEncode encode;
   encode.frame = std::move(frame);
-  encode.key_frame = force_keyframe;
+  encode.options = VideoEncoder::EncodeOptions(force_keyframe);
   pending_frames_.push_back(std::move(encode));
   FeedInput();
 }
@@ -485,7 +485,7 @@
     return;
 
   scoped_refptr<VideoFrame> frame = std::move(pending_frames_.front().frame);
-  bool key_frame = pending_frames_.front().key_frame;
+  bool key_frame = pending_frames_.front().options.key_frame;
   pending_frames_.pop_front();
 
   if (key_frame) {
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
index c3b37a00..ecd2590 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -1608,6 +1608,11 @@
           NOTIFY_ERROR(kPlatformFailureError);
           return;
         }
+        break;
+      case Bitrate::Mode::kExternal:
+        VLOGF(1) << "Unsupported rate control mode.";
+        NOTIFY_ERROR(kInvalidArgumentError);
+        return;
     }
   }
 
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
index d8871537..ca1fa63 100644
--- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
+++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc
@@ -570,12 +570,15 @@
        (kCPBSizeScale + H264SPS::kCPBSizeScaleConstantTerm)) -
       1;
   switch (curr_params_.bitrate_allocation.GetMode()) {
-    case (Bitrate::Mode::kConstant):
+    case Bitrate::Mode::kConstant:
       current_sps_.cbr_flag[0] = true;
       break;
-    case (Bitrate::Mode::kVariable):
+    case Bitrate::Mode::kVariable:
       current_sps_.cbr_flag[0] = false;
       break;
+    case Bitrate::Mode::kExternal:
+      NOTREACHED();
+      break;
   }
   current_sps_.initial_cpb_removal_delay_length_minus_1 =
       H264SPS::kDefaultInitialCPBRemovalDelayLength - 1;
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
index 340535d..7492b60 100644
--- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
+++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -1077,6 +1077,9 @@
       var.ulVal = eAVEncCommonRateControlMode_PeakConstrainedVBR;
       break;
     }
+    case Bitrate::Mode::kExternal:
+      // Unsupported.
+      return false;
   }
   hr = codec_api_->SetValue(&CODECAPI_AVEncCommonRateControlMode, &var);
   RETURN_ON_HR_FAILURE(hr, "Couldn't set CommonRateControlMode", false);
diff --git a/media/mojo/mojom/video_encode_accelerator.mojom b/media/mojo/mojom/video_encode_accelerator.mojom
index 427eded..9dc7a8de 100644
--- a/media/mojo/mojom/video_encode_accelerator.mojom
+++ b/media/mojo/mojom/video_encode_accelerator.mojom
@@ -128,10 +128,14 @@
   uint32 peak_bps;
 };
 
+struct ExternalBitrate {
+};
+
 // This defines a mojo transport format for media::Bitrate.
 union Bitrate {
   ConstantBitrate constant;
   VariableBitrate variable;
+  ExternalBitrate external;
 };
 
 // This defines a mojo transport format for
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
index 9a52a2c..341bd27 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
@@ -487,6 +487,14 @@
 }
 
 // static
+bool StructTraits<media::mojom::ExternalBitrateDataView, media::Bitrate>::Read(
+    media::mojom::ExternalBitrateDataView input,
+    media::Bitrate* output) {
+  *output = media::Bitrate::ExternalRateControl();
+  return true;
+}
+
+// static
 media::mojom::BitrateDataView::Tag
 UnionTraits<media::mojom::BitrateDataView, media::Bitrate>::GetTag(
     const media::Bitrate& input) {
@@ -495,6 +503,8 @@
       return media::mojom::BitrateDataView::Tag::kConstant;
     case media::Bitrate::Mode::kVariable:
       return media::mojom::BitrateDataView::Tag::kVariable;
+    case media::Bitrate::Mode::kExternal:
+      return media::mojom::BitrateDataView::Tag::kExternal;
   }
   NOTREACHED();
   return media::mojom::BitrateDataView::Tag::kConstant;
@@ -509,6 +519,8 @@
       return input.ReadConstant(output);
     case media::mojom::BitrateDataView::Tag::kVariable:
       return input.ReadVariable(output);
+    case media::mojom::BitrateDataView::Tag::kExternal:
+      return input.ReadExternal(output);
   }
 
   NOTREACHED();
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
index cafe7f42..784a4b7 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
@@ -443,10 +443,17 @@
 };
 
 template <>
+struct StructTraits<media::mojom::ExternalBitrateDataView, media::Bitrate> {
+  static bool Read(media::mojom::ExternalBitrateDataView input,
+                   media::Bitrate* output);
+};
+
+template <>
 struct UnionTraits<media::mojom::BitrateDataView, media::Bitrate> {
   static media::mojom::BitrateDataView::Tag GetTag(const media::Bitrate& input);
   static media::Bitrate constant(const media::Bitrate& input) { return input; }
   static media::Bitrate variable(const media::Bitrate& input) { return input; }
+  static media::Bitrate external(const media::Bitrate& input) { return input; }
   static bool Read(media::mojom::BitrateDataView input, media::Bitrate* output);
 };
 
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc
index 19796f6..41054f3 100644
--- a/media/video/av1_video_encoder.cc
+++ b/media/video/av1_video_encoder.cc
@@ -105,6 +105,15 @@
       case Bitrate::Mode::kConstant:
         config.rc_end_usage = AOM_CBR;
         break;
+      case Bitrate::Mode::kExternal:
+        // libaom doesn't have a special rate control mode for per-frame
+        // quantizer. Instead we just set CBR and set
+        // AV1E_SET_QUANTIZER_ONE_PASS before each frame.
+        config.rc_end_usage = AOM_CBR;
+        // Let the whole AV1 quantizer range to be used.
+        config.rc_max_quantizer = 63;
+        config.rc_min_quantizer = 1;
+        break;
     }
   } else {
     config.rc_end_usage = AOM_VBR;
@@ -293,7 +302,7 @@
 }
 
 void Av1VideoEncoder::Encode(scoped_refptr<VideoFrame> frame,
-                             bool key_frame,
+                             const EncodeOptions& encode_options,
                              EncoderStatusCB done_cb) {
   done_cb = BindCallbackToCurrentLoopIfNeeded(std::move(done_cb));
   if (!codec_) {
@@ -393,6 +402,7 @@
       NOTREACHED();
   }
 
+  bool key_frame = encode_options.key_frame;
   auto duration_us = GetFrameDuration(*frame).InMicroseconds();
   last_frame_timestamp_ = frame->timestamp();
   if (last_frame_color_space_ != frame->ColorSpace()) {
@@ -407,6 +417,15 @@
     return;
   }
 
+  if (encode_options.quantizer.has_value()) {
+    DCHECK_EQ(options_.bitrate->mode(), Bitrate::Mode::kExternal);
+    // Convert double quantizer to an integer within codec's supported range.
+    int qp = static_cast<int>(std::lround(encode_options.quantizer.value()));
+    qp = std::clamp(qp, static_cast<int>(config_.rc_min_quantizer),
+                    static_cast<int>(config_.rc_max_quantizer));
+    aom_codec_control(codec_.get(), AV1E_SET_QUANTIZER_ONE_PASS, qp);
+  }
+
   TRACE_EVENT1("media", "aom_codec_encode", "timestamp", frame->timestamp());
   // Use artificial timestamps, so the encoder will not be misled by frame's
   // fickle timestamps when doing rate control.
diff --git a/media/video/av1_video_encoder.h b/media/video/av1_video_encoder.h
index a07e124..8c6fe3b 100644
--- a/media/video/av1_video_encoder.h
+++ b/media/video/av1_video_encoder.h
@@ -31,7 +31,7 @@
                   OutputCB output_cb,
                   EncoderStatusCB done_cb) override;
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& encode_options,
               EncoderStatusCB done_cb) override;
   void ChangeOptions(const Options& options,
                      OutputCB output_cb,
diff --git a/media/video/offloading_video_encoder.cc b/media/video/offloading_video_encoder.cc
index dfa160e7..e242bac 100644
--- a/media/video/offloading_video_encoder.cc
+++ b/media/video/offloading_video_encoder.cc
@@ -55,7 +55,7 @@
 }
 
 void OffloadingVideoEncoder::Encode(scoped_refptr<VideoFrame> frame,
-                                    bool key_frame,
+                                    const EncodeOptions& encode_options,
                                     EncoderStatusCB done_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   TRACE_EVENT0("media", "OffloadingVideoEncoder::Encode");
@@ -63,7 +63,7 @@
       FROM_HERE,
       base::BindOnce(&VideoEncoder::Encode,
                      base::Unretained(wrapped_encoder_.get()), std::move(frame),
-                     key_frame, WrapCallback(std::move(done_cb))));
+                     encode_options, WrapCallback(std::move(done_cb))));
 }
 
 void OffloadingVideoEncoder::ChangeOptions(const Options& options,
diff --git a/media/video/offloading_video_encoder.h b/media/video/offloading_video_encoder.h
index 3864493..20a0e23 100644
--- a/media/video/offloading_video_encoder.h
+++ b/media/video/offloading_video_encoder.h
@@ -44,7 +44,7 @@
                   EncoderStatusCB done_cb) override;
 
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& encode_options,
               EncoderStatusCB done_cb) override;
 
   void ChangeOptions(const Options& options,
diff --git a/media/video/offloading_video_encoder_unittest.cc b/media/video/offloading_video_encoder_unittest.cc
index e4a67a6..d65640c 100644
--- a/media/video/offloading_video_encoder_unittest.cc
+++ b/media/video/offloading_video_encoder_unittest.cc
@@ -104,13 +104,15 @@
       });
 
   EXPECT_CALL(*mock_video_encoder_, Encode(_, _, _))
-      .WillOnce(Invoke([this](scoped_refptr<VideoFrame> frame, bool key_frame,
+      .WillOnce(Invoke([this](scoped_refptr<VideoFrame> frame,
+                              const VideoEncoder::EncodeOptions& options,
                               VideoEncoder::EncoderStatusCB done_cb) {
         EXPECT_TRUE(work_runner_->RunsTasksInCurrentSequence());
         std::move(done_cb).Run(EncoderStatus::Codes::kOk);
       }));
 
-  offloading_encoder_->Encode(nullptr, false, std::move(done_cb));
+  offloading_encoder_->Encode(nullptr, VideoEncoder::EncodeOptions(false),
+                              std::move(done_cb));
   RunLoop();
   EXPECT_TRUE(called_done);
 }
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc
index 27d6ca9..68f3dfc 100644
--- a/media/video/openh264_video_encoder.cc
+++ b/media/video/openh264_video_encoder.cc
@@ -147,6 +147,14 @@
     return;
   }
 
+  if (options.bitrate.has_value() &&
+      options.bitrate->mode() == Bitrate::Mode::kExternal) {
+    std::move(done_cb).Run(
+        EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
+                      "Unsupported bitrate mode"));
+    return;
+  }
+
   ISVCEncoder* raw_codec = nullptr;
   if (WelsCreateSVCEncoder(&raw_codec) != 0) {
     std::move(done_cb).Run(
@@ -285,7 +293,7 @@
 }
 
 void OpenH264VideoEncoder::Encode(scoped_refptr<VideoFrame> frame,
-                                  bool key_frame,
+                                  const EncodeOptions& encode_options,
                                   EncoderStatusCB done_cb) {
   done_cb = BindCallbackToCurrentLoopIfNeeded(std::move(done_cb));
   if (!codec_) {
@@ -348,6 +356,7 @@
     frame = std::move(i420_frame);
   }
 
+  bool key_frame = encode_options.key_frame;
   if (last_frame_color_space_ != frame->ColorSpace()) {
     last_frame_color_space_ = frame->ColorSpace();
     key_frame = true;
diff --git a/media/video/openh264_video_encoder.h b/media/video/openh264_video_encoder.h
index 4986c6b..ce08c99f 100644
--- a/media/video/openh264_video_encoder.h
+++ b/media/video/openh264_video_encoder.h
@@ -29,7 +29,7 @@
                   OutputCB output_cb,
                   EncoderStatusCB done_cb) override;
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& encode_options,
               EncoderStatusCB done_cb) override;
   void ChangeOptions(const Options& options,
                      OutputCB output_cb,
diff --git a/media/video/software_video_encoder_test.cc b/media/video/software_video_encoder_test.cc
index c05337f..413177f 100644
--- a/media/video/software_video_encoder_test.cc
+++ b/media/video/software_video_encoder_test.cc
@@ -112,6 +112,7 @@
   }
 
   void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+  void RunUntilQuit() { task_environment_.RunUntilQuit(); }
 
   scoped_refptr<VideoFrame> CreateI420Frame(gfx::Size size,
                                             uint32_t color,
@@ -215,6 +216,7 @@
   }
 
   VideoEncoder::EncoderStatusCB ValidatingStatusCB(
+      bool quit_run_loop_on_call = false,
       base::Location loc = FROM_HERE) {
     struct CallEnforcer {
       bool called = false;
@@ -225,7 +227,7 @@
     };
     auto enforcer = std::make_unique<CallEnforcer>();
     enforcer->location = loc.ToString();
-    return base::BindLambdaForTesting(
+    auto check_callback = base::BindLambdaForTesting(
         [enforcer{std::move(enforcer)}](EncoderStatus s) {
           EXPECT_TRUE(s.is_ok())
               << " Callback created: " << enforcer->location
@@ -233,6 +235,12 @@
               << " Error: " << s.message();
           enforcer->called = true;
         });
+
+    if (quit_run_loop_on_call) {
+      return std::move(check_callback).Then(task_environment_.QuitClosure());
+    } else {
+      return check_callback;
+    }
   }
 
   VideoDecoder::DecodeCB DecoderStatusCB(base::Location loc = FROM_HERE) {
@@ -307,6 +315,16 @@
                                           : PIXEL_FORMAT_I420;
   }
 
+  std::pair<int, int> GetQpRange(VideoCodec codec) {
+    switch (codec) {
+      case media::VideoCodec::kAV1:
+      case media::VideoCodec::kVP9:
+        return {0, 63};
+      default:
+        return {0, 0};
+    }
+  }
+
  protected:
   VideoCodec codec_;
   VideoCodecProfile profile_;
@@ -351,10 +369,12 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
-  RunUntilIdle();
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(output_cb),
+                       ValidatingStatusCB(
+                           /* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_FALSE(output_called) << "Output callback shouldn't be called";
 }
 
@@ -373,17 +393,20 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   for (int i = 0; i < frames; i++) {
     auto timestamp = i * frame_duration;
     auto frame = CreateFrame(options.frame_size, pixel_format_, timestamp);
-    encoder_->Encode(frame, true, ValidatingStatusCB());
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                     ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+    RunUntilQuit();
   }
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(outputs_count, frames);
 }
 
@@ -400,18 +423,22 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
 
+  RunUntilQuit();
   auto frame1 = CreateFrame(gfx::Size(320, 200), pixel_format_, 0 * sec);
   auto frame2 = CreateFrame(gfx::Size(800, 600), pixel_format_, 1 * sec);
   auto frame3 = CreateFrame(gfx::Size(720, 1280), pixel_format_, 2 * sec);
-  encoder_->Encode(frame1, false, ValidatingStatusCB());
-  encoder_->Encode(frame2, false, ValidatingStatusCB());
-  encoder_->Encode(frame3, false, ValidatingStatusCB());
+  encoder_->Encode(frame1, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB());
+  encoder_->Encode(frame2, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB());
+  encoder_->Encode(frame3, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB());
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(outputs_count, 3);
 }
 
@@ -436,21 +463,66 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
 
-  RunUntilIdle();
+  RunUntilQuit();
   uint32_t color = 0x964050;
   for (int frame_index = 0; frame_index < total_frames_count; frame_index++) {
     auto timestamp = frame_index * frame_duration;
     auto frame =
         CreateFrame(options.frame_size, pixel_format_, timestamp, color);
     color = (color << 1) + frame_index;
-    encoder_->Encode(frame, false, ValidatingStatusCB());
-    RunUntilIdle();
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(false),
+                     ValidatingStatusCB());
   }
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  EXPECT_EQ(outputs_count, total_frames_count);
+}
+
+TEST_P(SoftwareVideoEncoderTest, PerFrameQpEncoding) {
+  VideoEncoder::Options options;
+  options.frame_size = gfx::Size(320, 200);
+  options.bitrate = Bitrate::ExternalRateControl();
+  options.framerate = 25;
+  auto qp_range = GetQpRange(codec_);
+  if (qp_range.first == qp_range.second) {
+    GTEST_SKIP() << "Per frame QP control is not supported.";
+  }
+  int total_frames_count = qp_range.second - qp_range.first + 1;
+  int outputs_count = 0;
+
+  auto frame_duration = base::Seconds(1.0 / options.framerate.value());
+
+  VideoEncoder::OutputCB output_cb = base::BindLambdaForTesting(
+      [&](VideoEncoderOutput output,
+          absl::optional<VideoEncoder::CodecDescription> desc) {
+        EXPECT_NE(output.data, nullptr);
+        outputs_count++;
+      });
+
+  encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+
+  RunUntilQuit();
+  uint32_t color = 0x964050;
+  int qp = qp_range.first;
+  for (int frame_index = 0; frame_index < total_frames_count; frame_index++) {
+    auto timestamp = frame_index * frame_duration;
+    auto frame =
+        CreateFrame(options.frame_size, pixel_format_, timestamp, color);
+    color = (color << 1) + frame_index;
+    VideoEncoder::EncodeOptions encode_options(false);
+    encode_options.quantizer = qp;
+    qp++;
+    encoder_->Encode(frame, encode_options, ValidatingStatusCB());
+  }
+
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(outputs_count, total_frames_count);
 }
 
@@ -488,8 +560,9 @@
   PrepareDecoder(options.frame_size, std::move(decoder_output_cb));
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(encoder_output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(encoder_output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   uint32_t color = 0x964050;
   for (int frame_index = 0; frame_index < total_frames_count; frame_index++) {
@@ -498,11 +571,13 @@
         CreateFrame(options.frame_size, pixel_format_, timestamp, color);
     frames_to_encode.push_back(frame);
     color = (color << 1) + frame_index;
-    encoder_->Encode(frame, false, ValidatingStatusCB());
-    RunUntilIdle();
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(false),
+                     ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+    RunUntilQuit();
   }
 
-  encoder_->Flush(ValidatingStatusCB());
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   DecodeAndWaitForStatus(DecoderBuffer::CreateEOSBuffer());
   EXPECT_EQ(decoded_frames.size(), frames_to_encode.size());
   for (auto i = 0u; i < decoded_frames.size(); i++) {
@@ -542,8 +617,9 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(encoder_output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(encoder_output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   uint32_t color = 0x964050;
   for (auto frame_index = 0u; frame_index < total_frames_count; frame_index++) {
@@ -552,12 +628,13 @@
         CreateFrame(options.frame_size, pixel_format_, timestamp, color);
     color = (color << 1) + frame_index;
     frames_to_encode.push_back(frame);
-    encoder_->Encode(frame, false, ValidatingStatusCB());
-    RunUntilIdle();
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(false),
+                     ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+    RunUntilQuit();
   }
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(chunks.size(), total_frames_count);
 
   int num_temporal_layers = 1;
@@ -637,8 +714,9 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(encoder_output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(encoder_output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   uint32_t color = 0x0080FF;
   for (auto frame_index = 0u; frame_index < total_frames_count; frame_index++) {
@@ -646,25 +724,27 @@
     const bool reconfigure = (frame_index == total_frames_count / 2);
 
     if (reconfigure) {
-      encoder_->Flush(ValidatingStatusCB());
-      RunUntilIdle();
+      encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+      RunUntilQuit();
 
       // Ask encoder to change encoded resolution, empty output callback
       // means the encoder should keep the old one.
       options.frame_size = size2;
-      encoder_->ChangeOptions(options, VideoEncoder::OutputCB(),
-                              ValidatingStatusCB());
-      RunUntilIdle();
+      encoder_->ChangeOptions(
+          options, VideoEncoder::OutputCB(),
+          ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+      RunUntilQuit();
     }
 
     auto frame =
         CreateFrame(options.frame_size, pixel_format_, timestamp, color);
     frames_to_encode.push_back(frame);
-    encoder_->Encode(frame, false, ValidatingStatusCB());
-    RunUntilIdle();
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(false),
+                     ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+    RunUntilQuit();
   }
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   EXPECT_EQ(chunks.size(), total_frames_count);
   gfx::Size current_size;
@@ -744,18 +824,25 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   auto frame1 = CreateFrame(options.frame_size, pixel_format_, 0 * sec);
   auto frame2 = CreateFrame(options.frame_size, pixel_format_, 1 * sec);
   auto frame3 = CreateFrame(options.frame_size, pixel_format_, 2 * sec);
-  encoder_->Encode(frame1, false, ValidatingStatusCB());
-  encoder_->Encode(frame2, false, ValidatingStatusCB());
-  encoder_->Encode(frame3, true, ValidatingStatusCB());
+  encoder_->Encode(frame1, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  encoder_->Encode(frame2, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  encoder_->Encode(frame3, VideoEncoder::EncodeOptions(true),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(outputs_count, 3);
 }
 
@@ -783,18 +870,25 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   auto frame1 = CreateFrame(options.frame_size, pixel_format_, 0 * sec);
   auto frame2 = CreateFrame(options.frame_size, pixel_format_, 1 * sec);
   auto frame3 = CreateFrame(options.frame_size, pixel_format_, 2 * sec);
-  encoder_->Encode(frame1, false, ValidatingStatusCB());
-  encoder_->Encode(frame2, false, ValidatingStatusCB());
-  encoder_->Encode(frame3, true, ValidatingStatusCB());
+  encoder_->Encode(frame1, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  encoder_->Encode(frame2, VideoEncoder::EncodeOptions(false),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
+  encoder_->Encode(frame3, VideoEncoder::EncodeOptions(true),
+                   ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
   EXPECT_EQ(outputs_count, 3);
 }
 
@@ -825,8 +919,9 @@
       });
 
   encoder_->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
-                       std::move(encoder_output_cb), ValidatingStatusCB());
-  RunUntilIdle();
+                       std::move(encoder_output_cb),
+                       ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   uint32_t color = 0x964050;
   for (auto frame_index = 0u; frame_index < total_frames_count; frame_index++) {
@@ -835,11 +930,12 @@
     auto frame =
         CreateFrame(options.frame_size, pixel_format_, timestamp, color);
     frames_to_encode.push_back(frame);
-    encoder_->Encode(frame, key_frame, ValidatingStatusCB());
-    RunUntilIdle();
+    encoder_->Encode(frame, VideoEncoder::EncodeOptions(key_frame),
+                     ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+    RunUntilQuit();
   }
-  encoder_->Flush(ValidatingStatusCB());
-  RunUntilIdle();
+  encoder_->Flush(ValidatingStatusCB(/* quit_run_loop_on_call */ true));
+  RunUntilQuit();
 
   EXPECT_EQ(chunks.size(), total_frames_count);
   for (auto& chunk : chunks) {
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index 8b9c4b33..72062cb7 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -491,19 +491,19 @@
 }
 
 void VideoEncodeAcceleratorAdapter::Encode(scoped_refptr<VideoFrame> frame,
-                                           bool key_frame,
+                                           const EncodeOptions& encode_options,
                                            EncoderStatusCB done_cb) {
   DCHECK(!accelerator_task_runner_->RunsTasksInCurrentSequence());
   accelerator_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&VideoEncodeAcceleratorAdapter::EncodeOnAcceleratorThread,
-                     base::Unretained(this), std::move(frame), key_frame,
+                     base::Unretained(this), std::move(frame), encode_options,
                      WrapCallback(std::move(done_cb))));
 }
 
 void VideoEncodeAcceleratorAdapter::EncodeOnAcceleratorThread(
     scoped_refptr<VideoFrame> frame,
-    bool key_frame,
+    const EncodeOptions& encode_options,
     EncoderStatusCB done_cb) {
   TRACE_EVENT1("media",
                "VideoEncodeAcceleratorAdapter::EncodeOnAcceleratorThread",
@@ -515,7 +515,7 @@
     auto pending_encode = std::make_unique<PendingEncode>();
     pending_encode->done_callback = std::move(done_cb);
     pending_encode->frame = std::move(frame);
-    pending_encode->key_frame = key_frame;
+    pending_encode->options = encode_options;
     pending_encodes_.push_back(std::move(pending_encode));
     if (state_ == State::kWaitingForFirstFrame)
       InitializeInternalOnAcceleratorThread();
@@ -563,6 +563,7 @@
 
   frame = std::move(result).value();
 
+  bool key_frame = encode_options.key_frame;
   if (last_frame_color_space_ != frame->ColorSpace()) {
     last_frame_color_space_ = frame->ColorSpace();
     key_frame = true;
@@ -914,7 +915,7 @@
 
   // Send off the encodes that came in while we were waiting for initialization.
   for (auto& encode : pending_encodes_) {
-    EncodeOnAcceleratorThread(std::move(encode->frame), encode->key_frame,
+    EncodeOnAcceleratorThread(std::move(encode->frame), encode->options,
                               std::move(encode->done_callback));
   }
   pending_encodes_.clear();
diff --git a/media/video/video_encode_accelerator_adapter.h b/media/video/video_encode_accelerator_adapter.h
index 4d389367..1f02e38 100644
--- a/media/video/video_encode_accelerator_adapter.h
+++ b/media/video/video_encode_accelerator_adapter.h
@@ -65,7 +65,7 @@
                   OutputCB output_cb,
                   EncoderStatusCB done_cb) override;
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& encode_options,
               EncoderStatusCB done_cb) override;
   void ChangeOptions(const Options& options,
                      OutputCB output_cb,
@@ -115,7 +115,7 @@
                                      EncoderStatusCB done_cb);
   void InitializeInternalOnAcceleratorThread();
   void EncodeOnAcceleratorThread(scoped_refptr<VideoFrame> frame,
-                                 bool key_frame,
+                                 const EncodeOptions& encode_options,
                                  EncoderStatusCB done_cb);
   void FlushOnAcceleratorThread(EncoderStatusCB done_cb);
   void ChangeOptionsOnAcceleratorThread(const Options options,
diff --git a/media/video/video_encode_accelerator_adapter_test.cc b/media/video/video_encode_accelerator_adapter_test.cc
index 41145af..42af398 100644
--- a/media/video/video_encode_accelerator_adapter_test.cc
+++ b/media/video/video_encode_accelerator_adapter_test.cc
@@ -263,7 +263,8 @@
   auto frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
 
-  adapter()->Encode(frame, true, ValidatingStatusCB());
+  adapter()->Encode(frame, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
   vea()->NotifyEncoderInfoChange(VideoEncoderInfo());
   RunUntilIdle();
@@ -331,15 +332,20 @@
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(4));
   auto frame5 =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(5));
-  adapter()->Encode(frame1, true, ValidatingStatusCB());
+  adapter()->Encode(frame1, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
-  adapter()->Encode(frame2, true, ValidatingStatusCB());
+  adapter()->Encode(frame2, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
-  adapter()->Encode(frame3, true, ValidatingStatusCB());
+  adapter()->Encode(frame3, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
-  adapter()->Encode(frame4, true, ValidatingStatusCB());
+  adapter()->Encode(frame4, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
-  adapter()->Encode(frame5, true, ValidatingStatusCB());
+  adapter()->Encode(frame5, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
   EXPECT_EQ(outputs_count, 5);
 }
@@ -370,7 +376,8 @@
 
   auto frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
-  adapter()->Encode(frame, true, ValidatingStatusCB());
+  adapter()->Encode(frame, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   adapter()->Flush(base::BindLambdaForTesting([&](EncoderStatus s) {
     EXPECT_TRUE(s.is_ok());
     EXPECT_EQ(outputs_count, 1);
@@ -405,7 +412,8 @@
 
   auto frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
-  adapter()->Encode(frame, true, std::move(expect_error_done_cb));
+  adapter()->Encode(frame, VideoEncoder::EncodeOptions(true),
+                    std::move(expect_error_done_cb));
   RunUntilIdle();
   EXPECT_EQ(outputs_count, 0);
 }
@@ -431,7 +439,8 @@
 
   auto frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
-  adapter()->Encode(frame, true, std::move(expect_error_done_cb));
+  adapter()->Encode(frame, VideoEncoder::EncodeOptions(true),
+                    std::move(expect_error_done_cb));
   RunUntilIdle();
   EXPECT_EQ(outputs_count, 0);
 }
@@ -471,8 +480,10 @@
   adapter()->Initialize(profile_, options, /*info_cb=*/base::DoNothing(),
                         std::move(output_cb), ValidatingStatusCB());
 
-  adapter()->Encode(small_frame, true, ValidatingStatusCB());
-  adapter()->Encode(large_frame, false, ValidatingStatusCB());
+  adapter()->Encode(small_frame, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
+  adapter()->Encode(large_frame, VideoEncoder::EncodeOptions(false),
+                    ValidatingStatusCB());
   RunUntilIdle();
   EXPECT_EQ(outputs_count, 2);
 }
@@ -505,8 +516,10 @@
       CreateGreenFrame(small_size, pixel_format, base::Milliseconds(1));
   auto frame2 =
       CreateGreenFrame(small_size, pixel_format, base::Milliseconds(2));
-  adapter()->Encode(frame1, true, ValidatingStatusCB());
-  adapter()->Encode(frame2, false, ValidatingStatusCB());
+  adapter()->Encode(frame1, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
+  adapter()->Encode(frame2, VideoEncoder::EncodeOptions(false),
+                    ValidatingStatusCB());
   RunUntilIdle();
   EXPECT_EQ(outputs_count, 2);
 }
@@ -574,7 +587,8 @@
     bool key = frame_index % 9 == 0;
     auto frame =
         CreateGreenFrame(size, format, base::Milliseconds(frame_index));
-    adapter()->Encode(frame, key, ValidatingStatusCB());
+    adapter()->Encode(frame, VideoEncoder::EncodeOptions(key),
+                      ValidatingStatusCB());
   }
 
   RunUntilIdle();
@@ -609,9 +623,12 @@
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(2));
   auto frame3 =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(3));
-  adapter()->Encode(frame1, true, ValidatingStatusCB());
-  adapter()->Encode(frame2, false, ValidatingStatusCB());
-  adapter()->Encode(frame3, true, ValidatingStatusCB());
+  adapter()->Encode(frame1, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
+  adapter()->Encode(frame2, VideoEncoder::EncodeOptions(false),
+                    ValidatingStatusCB());
+  adapter()->Encode(frame3, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
   ASSERT_EQ(output_timestamps.size(), 2u);
   EXPECT_EQ(output_timestamps[0], base::Milliseconds(1));
@@ -653,7 +670,8 @@
   // We must encode one frame before we can change options.
   auto first_frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
-  adapter()->Encode(first_frame, true, ValidatingStatusCB());
+  adapter()->Encode(first_frame, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
 
   options.bitrate = Bitrate::VariableBitrate(12345u, 23456u);
@@ -661,7 +679,8 @@
                            ValidatingStatusCB());
   auto second_frame =
       CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(2));
-  adapter()->Encode(second_frame, true, ValidatingStatusCB());
+  adapter()->Encode(second_frame, VideoEncoder::EncodeOptions(true),
+                    ValidatingStatusCB());
   RunUntilIdle();
 
   EXPECT_EQ(output_count_before_change, 1);
diff --git a/media/video/video_encoder_fallback.cc b/media/video/video_encoder_fallback.cc
index a9bc66e..2242f80e 100644
--- a/media/video/video_encoder_fallback.cc
+++ b/media/video/video_encoder_fallback.cc
@@ -57,27 +57,28 @@
 
 VideoEncoder::PendingEncode VideoEncoderFallback::MakePendingEncode(
     scoped_refptr<VideoFrame> frame,
-    bool key_frame,
+    const EncodeOptions& encode_options,
     EncoderStatusCB done_cb) {
   PendingEncode result;
   result.done_callback = std::move(done_cb);
   result.frame = std::move(frame);
-  result.key_frame = key_frame;
+  result.options = encode_options;
   return result;
 }
 
 void VideoEncoderFallback::Encode(scoped_refptr<VideoFrame> frame,
-                                  bool key_frame,
+                                  const EncodeOptions& encode_options,
                                   EncoderStatusCB done_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!init_done_cb_);
 
   if (use_fallback_) {
     if (fallback_initialized_) {
-      encoder_->Encode(std::move(frame), key_frame, std::move(done_cb));
+      encoder_->Encode(std::move(frame), encode_options, std::move(done_cb));
     } else {
-      encodes_to_retry_.push_back(std::make_unique<PendingEncode>(
-          MakePendingEncode(std::move(frame), key_frame, std::move(done_cb))));
+      encodes_to_retry_.push_back(
+          std::make_unique<PendingEncode>(MakePendingEncode(
+              std::move(frame), encode_options, std::move(done_cb))));
     }
     return;
   }
@@ -94,10 +95,10 @@
     self->FallbackEncode(std::move(args));
   };
 
-  encoder_->Encode(
-      frame, key_frame,
-      base::BindOnce(done_callback, weak_factory_.GetWeakPtr(),
-                     MakePendingEncode(frame, key_frame, std::move(done_cb))));
+  encoder_->Encode(frame, encode_options,
+                   base::BindOnce(done_callback, weak_factory_.GetWeakPtr(),
+                                  MakePendingEncode(frame, encode_options,
+                                                    std::move(done_cb))));
 }
 
 void VideoEncoderFallback::ChangeOptions(const Options& options,
@@ -124,7 +125,7 @@
 
   if (status.is_ok()) {
     for (auto& encode : encodes_to_retry_) {
-      encoder_->Encode(std::move(encode->frame), encode->key_frame,
+      encoder_->Encode(std::move(encode->frame), encode->options,
                        std::move(encode->done_callback));
     }
   } else {
@@ -177,7 +178,7 @@
   }
 
   if (fallback_initialized_) {
-    encoder_->Encode(std::move(args.frame), args.key_frame,
+    encoder_->Encode(std::move(args.frame), args.options,
                      std::move(args.done_callback));
   } else {
     encodes_to_retry_.push_back(
diff --git a/media/video/video_encoder_fallback.h b/media/video/video_encoder_fallback.h
index 116cd87..b6cb0952 100644
--- a/media/video/video_encoder_fallback.h
+++ b/media/video/video_encoder_fallback.h
@@ -36,7 +36,7 @@
                   OutputCB output_cb,
                   EncoderStatusCB done_cb) override;
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& encode_options,
               EncoderStatusCB done_cb) override;
   void ChangeOptions(const Options& options,
                      OutputCB output_cb,
@@ -48,7 +48,7 @@
   void FallbackEncode(PendingEncode args);
   void FallbackInitCompleted(EncoderStatus status);
   PendingEncode MakePendingEncode(scoped_refptr<VideoFrame> frame,
-                                  bool key_frame,
+                                  const EncodeOptions& encode_options,
                                   EncoderStatusCB done_cb);
   void CallInfo(const VideoEncoderInfo& info);
   void CallOutput(VideoEncoderOutput output,
diff --git a/media/video/video_encoder_fallback_test.cc b/media/video/video_encoder_fallback_test.cc
index 828f726..dd5a225e 100644
--- a/media/video/video_encoder_fallback_test.cc
+++ b/media/video/video_encoder_fallback_test.cc
@@ -117,7 +117,8 @@
 
   EXPECT_CALL(*main_video_encoder_, Encode(_, _, _))
       .WillRepeatedly(
-          Invoke([&, this](scoped_refptr<VideoFrame> frame, bool key_frame,
+          Invoke([&, this](scoped_refptr<VideoFrame> frame,
+                           const VideoEncoder::EncodeOptions& options,
                            VideoEncoder::EncoderStatusCB done_cb) {
             VideoEncoderOutput output;
             output.timestamp = frame->timestamp();
@@ -133,7 +134,8 @@
     auto frame = VideoFrame::CreateFrame(PIXEL_FORMAT_I420, kFrameSize,
                                          gfx::Rect(kFrameSize), kFrameSize,
                                          base::Seconds(i));
-    fallback_encoder_->Encode(frame, true, ValidatingStatusCB());
+    fallback_encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                              ValidatingStatusCB());
   }
   RunLoop();
   EXPECT_FALSE(FallbackHappened());
@@ -186,7 +188,8 @@
   // All encodes should come to the secondary encoder.
   EXPECT_CALL(*secondary_video_encoder_, Encode(_, _, _))
       .WillRepeatedly(
-          Invoke([&, this](scoped_refptr<VideoFrame> frame, bool key_frame,
+          Invoke([&, this](scoped_refptr<VideoFrame> frame,
+                           const VideoEncoder::EncodeOptions& options,
                            VideoEncoder::EncoderStatusCB done_cb) {
             VideoEncoderOutput output;
             output.timestamp = frame->timestamp();
@@ -202,7 +205,8 @@
     auto frame = VideoFrame::CreateFrame(PIXEL_FORMAT_I420, kFrameSize,
                                          gfx::Rect(kFrameSize), kFrameSize,
                                          base::Seconds(i));
-    fallback_encoder_->Encode(frame, true, ValidatingStatusCB());
+    fallback_encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                              ValidatingStatusCB());
   }
   RunLoop();
   EXPECT_TRUE(FallbackHappened());
@@ -259,9 +263,10 @@
 
   // Start failing encodes after half of the frames.
   EXPECT_CALL(*main_video_encoder_, Encode(_, _, _))
-      .WillRepeatedly(Invoke([&, this](scoped_refptr<VideoFrame> frame,
-                                       bool key_frame,
-                                       VideoEncoder::EncoderStatusCB done_cb) {
+      .WillRepeatedly(Invoke([&, this](
+                                 scoped_refptr<VideoFrame> frame,
+                                 const VideoEncoder::EncodeOptions& options,
+                                 VideoEncoder::EncoderStatusCB done_cb) {
         EXPECT_TRUE(frame);
         EXPECT_TRUE(done_cb);
         if (frame->timestamp() > encoder_switch_time) {
@@ -278,7 +283,8 @@
   // All encodes should come to the secondary encoder.
   EXPECT_CALL(*secondary_video_encoder_, Encode(_, _, _))
       .WillRepeatedly(
-          Invoke([&, this](scoped_refptr<VideoFrame> frame, bool key_frame,
+          Invoke([&, this](scoped_refptr<VideoFrame> frame,
+                           const VideoEncoder::EncodeOptions& options,
                            VideoEncoder::EncoderStatusCB done_cb) {
             EXPECT_TRUE(frame);
             EXPECT_TRUE(done_cb);
@@ -297,7 +303,8 @@
     auto frame = VideoFrame::CreateFrame(PIXEL_FORMAT_I420, kFrameSize,
                                          gfx::Rect(kFrameSize), kFrameSize,
                                          base::Seconds(i));
-    fallback_encoder_->Encode(frame, true, ValidatingStatusCB());
+    fallback_encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                              ValidatingStatusCB());
   }
   RunLoop();
   EXPECT_TRUE(FallbackHappened());
@@ -341,9 +348,10 @@
 
   EXPECT_CALL(*secondary_video_encoder_, Encode(_, _, _))
       .Times(kFrameCount)
-      .WillRepeatedly(Invoke([&, this](scoped_refptr<VideoFrame> frame,
-                                       bool key_frame,
-                                       VideoEncoder::EncoderStatusCB done_cb) {
+      .WillRepeatedly(Invoke([&, this](
+                                 scoped_refptr<VideoFrame> frame,
+                                 const VideoEncoder::EncodeOptions& options,
+                                 VideoEncoder::EncoderStatusCB done_cb) {
         RunStatusCallbackAync(std::move(done_cb),
                               EncoderStatus::Codes::kEncoderUnsupportedCodec);
       }));
@@ -357,7 +365,8 @@
       EXPECT_EQ(s.code(), EncoderStatus::Codes::kEncoderUnsupportedCodec);
       callback_runner_->DeleteSoon(FROM_HERE, std::move(fallback_encoder_));
     });
-    fallback_encoder_->Encode(frame, true, std::move(done_callback));
+    fallback_encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                              std::move(done_callback));
   }
 
   RunLoop();
@@ -402,9 +411,10 @@
   // Start failing encodes after half of the frames.
   auto encoder_switch_time = base::Seconds(kFrameCount / 2);
   EXPECT_CALL(*main_video_encoder_, Encode(_, _, _))
-      .WillRepeatedly(Invoke([&, this](scoped_refptr<VideoFrame> frame,
-                                       bool key_frame,
-                                       VideoEncoder::EncoderStatusCB done_cb) {
+      .WillRepeatedly(Invoke([&, this](
+                                 scoped_refptr<VideoFrame> frame,
+                                 const VideoEncoder::EncodeOptions& options,
+                                 VideoEncoder::EncoderStatusCB done_cb) {
         EXPECT_TRUE(frame);
         EXPECT_TRUE(done_cb);
         if (frame->timestamp() > encoder_switch_time) {
@@ -423,9 +433,10 @@
   auto second_encoder_fail_time = base::Seconds(3 * kFrameCount / 4);
   LOG(ERROR) << second_encoder_fail_time << "!!!!";
   EXPECT_CALL(*secondary_video_encoder_, Encode(_, _, _))
-      .WillRepeatedly(Invoke([&, this](scoped_refptr<VideoFrame> frame,
-                                       bool key_frame,
-                                       VideoEncoder::EncoderStatusCB done_cb) {
+      .WillRepeatedly(Invoke([&, this](
+                                 scoped_refptr<VideoFrame> frame,
+                                 const VideoEncoder::EncodeOptions& options,
+                                 VideoEncoder::EncoderStatusCB done_cb) {
         EXPECT_TRUE(frame);
         EXPECT_TRUE(done_cb);
         EXPECT_GT(frame->timestamp(), encoder_switch_time);
@@ -451,7 +462,8 @@
         ValidatingStatusCB((frame->timestamp() <= second_encoder_fail_time)
                                ? EncoderStatus::Codes::kOk
                                : EncoderStatus::Codes::kEncoderFailedEncode);
-    fallback_encoder_->Encode(frame, true, std::move(done_cb));
+    fallback_encoder_->Encode(frame, VideoEncoder::EncodeOptions(true),
+                              std::move(done_cb));
   }
   RunLoop();
   EXPECT_TRUE(FallbackHappened());
diff --git a/media/video/vpx_video_encoder.cc b/media/video/vpx_video_encoder.cc
index 3471a0b..e112bd9c 100644
--- a/media/video/vpx_video_encoder.cc
+++ b/media/video/vpx_video_encoder.cc
@@ -4,6 +4,8 @@
 
 #include "media/video/vpx_video_encoder.h"
 
+#include <algorithm>
+
 #include "base/cxx17_backports.h"
 #include "base/logging.h"
 #include "base/numerics/checked_math.h"
@@ -121,6 +123,15 @@
       case Bitrate::Mode::kConstant:
         config->rc_end_usage = VPX_CBR;
         break;
+      case Bitrate::Mode::kExternal:
+        // libvpx doesn't have a special rate control mode for per-frame
+        // quantizer. Instead we just set CBR and set
+        // VP9E_SET_QUANTIZER_ONE_PASS before each frame.
+        config->rc_end_usage = VPX_CBR;
+        // Let the whole AV1 quantizer range to be used.
+        config->rc_max_quantizer = 63;
+        config->rc_min_quantizer = 0;
+        break;
     }
   } else {
     config->rc_target_bitrate = GetDefaultVideoEncodeBitrate(
@@ -275,6 +286,14 @@
     return;
   }
 
+  if (options.bitrate.has_value() &&
+      options.bitrate->mode() == Bitrate::Mode::kExternal && !is_vp9) {
+    std::move(done_cb).Run(
+        EncoderStatus(EncoderStatus::Codes::kEncoderInitializationError,
+                      "Unsupported bitrate mode"));
+    return;
+  }
+
   auto vpx_error = vpx_codec_enc_config_default(iface, &codec_config_, 0);
   if (vpx_error != VPX_CODEC_OK) {
     auto status =
@@ -382,8 +401,9 @@
     }
 
     // In CBR mode use aq-mode=3 is enabled for quality improvement
-    if (codec_config_.rc_end_usage == VPX_CBR)
+    if (codec_config_.rc_end_usage == VPX_CBR) {
       vpx_codec_control(codec.get(), VP9E_SET_AQ_MODE, 3);
+    }
   }
 
   options_ = options;
@@ -400,7 +420,7 @@
 }
 
 void VpxVideoEncoder::Encode(scoped_refptr<VideoFrame> frame,
-                             bool key_frame,
+                             const EncodeOptions& encode_options,
                              EncoderStatusCB done_cb) {
   done_cb = BindCallbackToCurrentLoopIfNeeded(std::move(done_cb));
   if (!codec_) {
@@ -409,6 +429,7 @@
     return;
   }
 
+  bool key_frame = encode_options.key_frame;
   if (!frame) {
     std::move(done_cb).Run(
         EncoderStatus(EncoderStatus::Codes::kEncoderFailedEncode,
@@ -564,6 +585,15 @@
     }
   }
 
+  if (encode_options.quantizer.has_value()) {
+    DCHECK_EQ(options_.bitrate->mode(), Bitrate::Mode::kExternal);
+    // Convert double quantizer to an integer within codec's supported range.
+    int qp = static_cast<int>(std::lround(encode_options.quantizer.value()));
+    qp = std::clamp(qp, static_cast<int>(codec_config_.rc_min_quantizer),
+                    static_cast<int>(codec_config_.rc_max_quantizer));
+    vpx_codec_control(codec_.get(), VP9E_SET_QUANTIZER_ONE_PASS, qp);
+  }
+
   TRACE_EVENT1("media", "vpx_codec_encode", "timestamp", frame->timestamp());
   auto vpx_error = vpx_codec_encode(codec_.get(), &vpx_image_, timestamp_us,
                                     duration_us, flags, deadline);
diff --git a/media/video/vpx_video_encoder.h b/media/video/vpx_video_encoder.h
index 2a8d9da3..de90fcb 100644
--- a/media/video/vpx_video_encoder.h
+++ b/media/video/vpx_video_encoder.h
@@ -30,7 +30,7 @@
                   OutputCB output_cb,
                   EncoderStatusCB done_cb) override;
   void Encode(scoped_refptr<VideoFrame> frame,
-              bool key_frame,
+              const EncodeOptions& options,
               EncoderStatusCB done_cb) override;
   void ChangeOptions(const Options& options,
                      OutputCB output_cb,
diff --git a/net/base/address_list.cc b/net/base/address_list.cc
index 74850b5..ca57ff1b 100644
--- a/net/base/address_list.cc
+++ b/net/base/address_list.cc
@@ -115,7 +115,7 @@
                       std::move_iterator<iter_t>(aliases.end()));
 }
 
-base::Value AddressList::NetLogParams() const {
+base::Value::Dict AddressList::NetLogParams() const {
   base::Value::Dict dict;
 
   base::Value::List address_list;
@@ -128,7 +128,7 @@
     alias_list.Append(alias);
   dict.Set("aliases", std::move(alias_list));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void AddressList::Deduplicate() {
diff --git a/net/base/address_list.h b/net/base/address_list.h
index 589d605..ef5a3f8 100644
--- a/net/base/address_list.h
+++ b/net/base/address_list.h
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "base/compiler_specific.h"
+#include "base/values.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_export.h"
 
@@ -75,7 +76,7 @@
 
   // Creates a value representation of the address list, appropriate for
   // inclusion in a NetLog.
-  base::Value NetLogParams() const;
+  base::Value::Dict NetLogParams() const;
 
   // Deduplicates the stored addresses while otherwise preserving their order.
   void Deduplicate();
diff --git a/net/base/isolation_info.cc b/net/base/isolation_info.cc
index 668610a..c7d0041 100644
--- a/net/base/isolation_info.cc
+++ b/net/base/isolation_info.cc
@@ -368,12 +368,12 @@
   if (!top_frame_origin) {
     return NetworkAnonymizationKey();
   }
+  SchemefulSite top_frame_site(*top_frame_origin);
 
   bool nak_is_cross_site;
   if (frame_origin) {
-    SiteForCookies site_for_cookies =
-        net::SiteForCookies::FromOrigin(top_frame_origin.value());
-    nak_is_cross_site = !site_for_cookies.IsFirstParty(frame_origin->GetURL());
+    SchemefulSite frame_site(*frame_origin);
+    nak_is_cross_site = frame_site != top_frame_site;
   } else {
     // If we are unable to determine if the frame is cross site we should create
     // it as cross site.
@@ -381,8 +381,7 @@
   }
 
   return NetworkAnonymizationKey(
-      SchemefulSite(*top_frame_origin), absl::nullopt,
-      absl::make_optional(nak_is_cross_site),
+      top_frame_site, absl::nullopt, absl::make_optional(nak_is_cross_site),
       nonce ? absl::make_optional(*nonce) : absl::nullopt);
 }
 
diff --git a/net/base/isolation_info_unittest.cc b/net/base/isolation_info_unittest.cc
index 3d26824..3b8e1db 100644
--- a/net/base/isolation_info_unittest.cc
+++ b/net/base/isolation_info_unittest.cc
@@ -138,7 +138,10 @@
   EXPECT_EQ(isolation_info.DebugString(), base::StrCat(parts));
 }
 
-TEST_P(IsolationInfoTest, CreateNetworkAnonymizationKeyForIsolationInfo) {
+// TODO(crbug.com/1419563): Disabled as it was causing consistent failures
+// across multiple builders
+TEST_P(IsolationInfoTest,
+       DISABLED_CreateNetworkAnonymizationKeyForIsolationInfo) {
   IsolationInfo isolation_info = IsolationInfo::Create(
       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin2,
       SiteForCookies::FromOrigin(kOrigin1), kPartyContextEmpty, &kNonce1);
@@ -177,6 +180,32 @@
   }
 }
 
+// A 2.5-keyed NAK created with two identical opaque origins should be
+// same-site.
+TEST_P(IsolationInfoTest, CreateNetworkAnonymizationKeyForIsolationInfoOpaque) {
+  url::Origin opaque;
+  IsolationInfo isolation_info = IsolationInfo::Create(
+      IsolationInfo::RequestType::kMainFrame, opaque, opaque,
+      SiteForCookies::FromOrigin(opaque), kPartyContextEmpty, &kNonce1);
+  NetworkAnonymizationKey nak =
+      isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
+          opaque, opaque, &kNonce1);
+
+  if (IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled()) {
+    EXPECT_FALSE(nak.GetIsCrossSite().value());
+  } else {
+    EXPECT_DEATH_IF_SUPPORTED(nak.GetIsCrossSite(), "");
+  }
+
+  url::Origin opaque2;
+  nak = isolation_info.CreateNetworkAnonymizationKeyForIsolationInfo(
+      opaque, opaque2, &kNonce1);
+
+  if (IsDoubleKeyAndCrossSiteBitNetworkAnonymizationKeyEnabled()) {
+    EXPECT_TRUE(nak.GetIsCrossSite().value());
+  }
+}
+
 TEST_P(IsolationInfoTest, RequestTypeMainFrame) {
   IsolationInfo isolation_info = IsolationInfo::Create(
       IsolationInfo::RequestType::kMainFrame, kOrigin1, kOrigin1,
diff --git a/net/base/logging_network_change_observer.cc b/net/base/logging_network_change_observer.cc
index 1fd5ef9..7d18cad 100644
--- a/net/base/logging_network_change_observer.cc
+++ b/net/base/logging_network_change_observer.cc
@@ -39,7 +39,7 @@
 // Return a dictionary of values that provide information about a
 // network-specific change. This also includes relevant current state
 // like the default network, and the types of active networks.
-base::Value NetworkSpecificNetLogParams(handles::NetworkHandle network) {
+base::Value::Dict NetworkSpecificNetLogParams(handles::NetworkHandle network) {
   base::Value::Dict dict;
   dict.Set("changed_network_handle", HumanReadableNetworkHandle(network));
   dict.Set("changed_network_type",
@@ -57,7 +57,7 @@
         NetworkChangeNotifier::ConnectionTypeToString(
             NetworkChangeNotifier::GetNetworkConnectionType(active_network)));
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void NetLogNetworkSpecific(NetLog* net_log,
diff --git a/net/base/network_anonymization_key.cc b/net/base/network_anonymization_key.cc
index d2952fb..1d90bff6 100644
--- a/net/base/network_anonymization_key.cc
+++ b/net/base/network_anonymization_key.cc
@@ -28,10 +28,7 @@
   // the information to calculate it, do calculate it.
   if (IsCrossSiteFlagSchemeEnabled() && !is_cross_site_.has_value() &&
       frame_site.has_value()) {
-    SiteForCookies site_for_cookies =
-        net::SiteForCookies(top_frame_site_.value());
-    is_cross_site_ =
-        !site_for_cookies.IsFirstParty(frame_site.value().GetURL());
+    is_cross_site_ = frame_site.value() != top_frame_site_.value();
   }
   if (IsCrossSiteFlagSchemeEnabled()) {
     // If `frame_site_` is populated, `is_cross_site_` must be as well.
@@ -58,10 +55,8 @@
   // value will be overridden in the constructor and set to `nullopt`.
   absl::optional<bool> nak_is_cross_site = absl::nullopt;
   if (NetworkAnonymizationKey::IsCrossSiteFlagSchemeEnabled()) {
-    SiteForCookies site_for_cookies =
-        net::SiteForCookies(network_isolation_key.GetTopFrameSite().value());
-    nak_is_cross_site = !site_for_cookies.IsFirstParty(
-        network_isolation_key.GetFrameSite()->GetURL());
+    nak_is_cross_site = network_isolation_key.GetTopFrameSite().value() !=
+                        network_isolation_key.GetFrameSite().value();
   }
 
   return NetworkAnonymizationKey(
diff --git a/net/base/network_anonymization_key_unittest.cc b/net/base/network_anonymization_key_unittest.cc
index bc35e88..cfedaa0 100644
--- a/net/base/network_anonymization_key_unittest.cc
+++ b/net/base/network_anonymization_key_unittest.cc
@@ -93,9 +93,13 @@
 TEST_P(NetworkAnonymizationKeyTest, CreateFromNetworkIsolationKey) {
   SchemefulSite site_a = SchemefulSite(GURL("http://a.test/"));
   SchemefulSite site_b = SchemefulSite(GURL("http://b.test/"));
+  SchemefulSite opaque = SchemefulSite(url::Origin());
   base::UnguessableToken nik_nonce = base::UnguessableToken::Create();
+
   NetworkIsolationKey populated_cross_site_nik(site_a, site_b, &nik_nonce);
   NetworkIsolationKey populated_same_site_nik(site_a, site_a, &nik_nonce);
+  NetworkIsolationKey populated_same_site_opaque_nik(opaque, opaque,
+                                                     &nik_nonce);
   NetworkIsolationKey empty_nik;
 
   NetworkAnonymizationKey nak_from_cross_site_nik =
@@ -104,6 +108,9 @@
   NetworkAnonymizationKey nak_from_same_site_nik =
       NetworkAnonymizationKey::CreateFromNetworkIsolationKey(
           populated_same_site_nik);
+  NetworkAnonymizationKey nak_from_same_site_opaque_nik =
+      NetworkAnonymizationKey::CreateFromNetworkIsolationKey(
+          populated_same_site_opaque_nik);
   NetworkAnonymizationKey nak_from_empty_nik =
       NetworkAnonymizationKey::CreateFromNetworkIsolationKey(empty_nik);
 
@@ -116,10 +123,12 @@
     // Top site should be populated correctly.
     EXPECT_EQ(nak_from_cross_site_nik.GetTopFrameSite(), site_a);
     EXPECT_EQ(nak_from_same_site_nik.GetTopFrameSite(), site_a);
+    EXPECT_EQ(nak_from_same_site_opaque_nik.GetTopFrameSite(), opaque);
 
     // Nonce should be populated correctly.
-    EXPECT_EQ(nak_from_same_site_nik.GetNonce(), nik_nonce);
     EXPECT_EQ(nak_from_cross_site_nik.GetNonce(), nik_nonce);
+    EXPECT_EQ(nak_from_same_site_nik.GetNonce(), nik_nonce);
+    EXPECT_EQ(nak_from_same_site_opaque_nik.GetNonce(), nik_nonce);
 
     // Double-keyed NAKs created from different third party cross site contexts
     // should be the same.
@@ -131,14 +140,17 @@
     // Top site should be populated correctly.
     EXPECT_EQ(nak_from_cross_site_nik.GetTopFrameSite(), site_a);
     EXPECT_EQ(nak_from_same_site_nik.GetTopFrameSite(), site_a);
+    EXPECT_EQ(nak_from_same_site_opaque_nik.GetTopFrameSite(), opaque);
 
     // Nonce should be populated correctly.
     EXPECT_EQ(nak_from_same_site_nik.GetNonce(), nik_nonce);
     EXPECT_EQ(nak_from_cross_site_nik.GetNonce(), nik_nonce);
+    EXPECT_EQ(nak_from_same_site_opaque_nik.GetNonce(), nik_nonce);
 
     // Is cross site boolean should be populated correctly.
     EXPECT_EQ(nak_from_same_site_nik.GetIsCrossSite(), false);
     EXPECT_EQ(nak_from_cross_site_nik.GetIsCrossSite(), true);
+    EXPECT_EQ(nak_from_same_site_opaque_nik.GetIsCrossSite(), false);
 
     // Double-keyed + cross site bit NAKs created from different third party
     // cross site contexts should be the different.
@@ -236,24 +248,44 @@
                                            /*is_cross_site=*/true);
     NetworkAnonymizationKey equal_cross_site_key(/*top_frame_site=*/kTestSiteA,
                                                  /*frame_site=*/kTestSiteB);
+    EXPECT_EQ(cross_site_key.GetIsCrossSite().value(), true);
+    EXPECT_EQ(equal_cross_site_key.GetIsCrossSite().value(), true);
+    EXPECT_EQ(cross_site_key, equal_cross_site_key);
 
     NetworkAnonymizationKey same_site_key(/*top_frame_site=*/kTestSiteA,
                                           /*frame_site=*/kTestSiteA,
                                           /*is_cross_site=*/false);
     NetworkAnonymizationKey equal_same_site_key(/*top_frame_site=*/kTestSiteA,
                                                 /*frame_site=*/kTestSiteA);
-
-    NetworkAnonymizationKey double_key_cross_site(/*top_frame_site=*/kTestSiteA,
-                                                  /*frame_site=*/absl::nullopt,
-                                                  true);
-    EXPECT_EQ(cross_site_key.GetIsCrossSite().value(), true);
-    EXPECT_EQ(equal_cross_site_key.GetIsCrossSite().value(), true);
-    EXPECT_EQ(cross_site_key, equal_cross_site_key);
-
     EXPECT_EQ(same_site_key.GetIsCrossSite().value(), false);
     EXPECT_EQ(equal_same_site_key.GetIsCrossSite().value(), false);
     EXPECT_EQ(same_site_key, equal_same_site_key);
 
+    SchemefulSite opaque = SchemefulSite(url::Origin());
+    NetworkAnonymizationKey same_opaque_site_key(/*top_frame_site=*/opaque,
+                                                 /*frame_site=*/opaque,
+                                                 /*is_cross_site=*/false);
+    NetworkAnonymizationKey equal_same_opaque_site_key(
+        /*top_frame_site=*/opaque,
+        /*frame_site=*/opaque);
+    EXPECT_EQ(same_opaque_site_key.GetIsCrossSite().value(), false);
+    EXPECT_EQ(equal_same_opaque_site_key.GetIsCrossSite().value(), false);
+    EXPECT_EQ(same_opaque_site_key, equal_same_opaque_site_key);
+
+    SchemefulSite opaque2 = SchemefulSite(url::Origin());
+    NetworkAnonymizationKey diff_opaque_site_key(/*top_frame_site=*/opaque,
+                                                 /*frame_site=*/opaque2,
+                                                 /*is_cross_site=*/true);
+    NetworkAnonymizationKey equal_diff_opaque_site_key(
+        /*top_frame_site=*/opaque,
+        /*frame_site=*/opaque2);
+    EXPECT_EQ(diff_opaque_site_key.GetIsCrossSite().value(), true);
+    EXPECT_EQ(equal_diff_opaque_site_key.GetIsCrossSite().value(), true);
+    EXPECT_EQ(diff_opaque_site_key, equal_diff_opaque_site_key);
+
+    NetworkAnonymizationKey double_key_cross_site(/*top_frame_site=*/kTestSiteA,
+                                                  /*frame_site=*/absl::nullopt,
+                                                  true);
     EXPECT_EQ(double_key_cross_site.GetIsCrossSite().value(), true);
   }
 }
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index 2038f39..e4951c4 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -14,22 +14,22 @@
 
 namespace {
 
-base::Value NetLogInitEndInfoParams(int result,
-                                    int total_size,
-                                    bool is_chunked) {
+base::Value::Dict NetLogInitEndInfoParams(int result,
+                                          int total_size,
+                                          bool is_chunked) {
   base::Value::Dict dict;
 
   dict.Set("net_error", result);
   dict.Set("total_size", total_size);
   dict.Set("is_chunked", is_chunked);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value CreateReadInfoParams(int current_position) {
+base::Value::Dict CreateReadInfoParams(int current_position) {
   base::Value::Dict dict;
 
   dict.Set("current_position", current_position);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index a2f85c1f..84eb366 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -375,13 +375,14 @@
   return true;
 }
 
-base::Value CertVerifyParams(X509Certificate* cert,
-                             const std::string& hostname,
-                             const std::string& ocsp_response,
-                             const std::string& sct_list,
-                             int flags,
-                             CRLSet* crl_set,
-                             const CertificateList& additional_trust_anchors) {
+base::Value::Dict CertVerifyParams(
+    X509Certificate* cert,
+    const std::string& hostname,
+    const std::string& ocsp_response,
+    const std::string& sct_list,
+    int flags,
+    CRLSet* crl_set,
+    const CertificateList& additional_trust_anchors) {
   base::Value::Dict dict;
   dict.Set("certificates", NetLogX509CertificateList(cert));
   if (!ocsp_response.empty()) {
@@ -409,7 +410,7 @@
     dict.Set("additional_trust_anchors", std::move(certs));
   }
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/cert/cert_verify_proc_builtin.cc b/net/cert/cert_verify_proc_builtin.cc
index 9b2fb1e..7f08149a 100644
--- a/net/cert/cert_verify_proc_builtin.cc
+++ b/net/cert/cert_verify_proc_builtin.cc
@@ -57,8 +57,8 @@
 
 const void* const kResultDebugDataKey = &kResultDebugDataKey;
 
-base::Value NetLogCertParams(const CRYPTO_BUFFER* cert_handle,
-                             const CertErrors& errors) {
+base::Value::Dict NetLogCertParams(const CRYPTO_BUFFER* cert_handle,
+                                   const CertErrors& errors) {
   base::Value::Dict results;
 
   std::string pem_encoded;
@@ -71,14 +71,15 @@
   if (!errors_string.empty())
     results.Set("errors", errors_string);
 
-  return base::Value(std::move(results));
+  return results;
 }
 
 #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
-base::Value NetLogChromeRootStoreVersion(int64_t chrome_root_store_version) {
+base::Value::Dict NetLogChromeRootStoreVersion(
+    int64_t chrome_root_store_version) {
   base::Value::Dict results;
   results.Set("version_major", NetLogNumberValue(chrome_root_store_version));
-  return base::Value(std::move(results));
+  return results;
 }
 #endif
 
@@ -93,7 +94,7 @@
   return value;
 }
 
-base::Value NetLogPathBuilderResultPath(
+base::Value::Dict NetLogPathBuilderResultPath(
     const CertPathBuilderResultPath& result_path) {
   base::Value::Dict dict;
   dict.Set("is_valid", result_path.IsValid());
@@ -104,10 +105,11 @@
       result_path.errors.ToDebugString(result_path.certs);
   if (!errors_string.empty())
     dict.Set("errors", errors_string);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogPathBuilderResult(const CertPathBuilder::Result& result) {
+base::Value::Dict NetLogPathBuilderResult(
+    const CertPathBuilder::Result& result) {
   base::Value::Dict dict;
   // TODO(crbug.com/634484): include debug data (or just have things netlog it
   // directly).
@@ -117,7 +119,7 @@
     dict.Set("exceeded_iteration_limit", true);
   if (result.exceeded_deadline)
     dict.Set("exceeded_deadline", true);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 RevocationPolicy NoRevocationChecking() {
@@ -815,7 +817,7 @@
             results.Set("is_ev_attempt", true);
           results.Set("digest_policy",
                       static_cast<int>(cur_attempt.digest_policy));
-          return base::Value(std::move(results));
+          return results;
         });
 
     // If a previous attempt used up most/all of the deadline, extend the
diff --git a/net/cert/cert_verify_proc_builtin_unittest.cc b/net/cert/cert_verify_proc_builtin_unittest.cc
index f3f15b6..101a821f 100644
--- a/net/cert/cert_verify_proc_builtin_unittest.cc
+++ b/net/cert/cert_verify_proc_builtin_unittest.cc
@@ -517,24 +517,21 @@
       &NetLogEntry::type);
   ASSERT_NE(event, events.end());
   EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
-  ASSERT_TRUE(event->params.is_dict());
-  EXPECT_EQ(true, event->params.GetDict().FindBool("is_ev_attempt"));
+  EXPECT_EQ(true, event->params.FindBool("is_ev_attempt"));
 
   event = base::ranges::find(++event, events.end(),
                              NetLogEventType::CERT_VERIFY_PROC_PATH_BUILT,
                              &NetLogEntry::type);
   ASSERT_NE(event, events.end());
   EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
-  ASSERT_TRUE(event->params.is_dict());
-  EXPECT_FALSE(event->params.GetDict().FindString("errors"));
+  EXPECT_FALSE(event->params.FindString("errors"));
 
   event = base::ranges::find(
       ++event, events.end(),
       NetLogEventType::CERT_VERIFY_PROC_PATH_BUILD_ATTEMPT, &NetLogEntry::type);
   ASSERT_NE(event, events.end());
   EXPECT_EQ(net::NetLogEventPhase::END, event->phase);
-  ASSERT_TRUE(event->params.is_dict());
-  EXPECT_EQ(true, event->params.GetDict().FindBool("has_valid_path"));
+  EXPECT_EQ(true, event->params.FindBool("has_valid_path"));
 }
 #endif  // defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
 
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 4abbb08a..1b77fb7f 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -917,8 +917,7 @@
                                   &NetLogEntry::type);
   ASSERT_NE(event, events.end());
   EXPECT_EQ(net::NetLogEventPhase::BEGIN, event->phase);
-  ASSERT_TRUE(event->params.is_dict());
-  const std::string* host = event->params.FindStringKey("host");
+  const std::string* host = event->params.FindString("host");
   ASSERT_TRUE(host);
   EXPECT_EQ("127.0.0.1", *host);
 
@@ -928,8 +927,7 @@
                            &NetLogEntry::type);
     ASSERT_NE(event, events.end());
     EXPECT_EQ(net::NetLogEventPhase::NONE, event->phase);
-    ASSERT_TRUE(event->params.is_dict());
-    const std::string* errors = event->params.FindStringKey("errors");
+    const std::string* errors = event->params.FindString("errors");
     ASSERT_TRUE(errors);
     EXPECT_EQ(
         "ERROR: Failed parsing Certificate SEQUENCE\nERROR: Failed parsing "
diff --git a/net/cert/cert_verify_result.cc b/net/cert/cert_verify_result.cc
index 5a383188..49d205c 100644
--- a/net/cert/cert_verify_result.cc
+++ b/net/cert/cert_verify_result.cc
@@ -62,7 +62,7 @@
   ClearAllUserData();
 }
 
-base::Value CertVerifyResult::NetLogParams(int net_error) const {
+base::Value::Dict CertVerifyResult::NetLogParams(int net_error) const {
   base::Value::Dict dict;
   DCHECK_NE(ERR_IO_PENDING, net_error);
   if (net_error < 0)
@@ -86,7 +86,7 @@
 
   dict.Set("scts", net::NetLogSignedCertificateTimestampParams(&scts));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/cert/cert_verify_result.h b/net/cert/cert_verify_result.h
index ec3308a..7cdcb77f 100644
--- a/net/cert/cert_verify_result.h
+++ b/net/cert/cert_verify_result.h
@@ -7,6 +7,7 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/supports_user_data.h"
+#include "base/values.h"
 #include "net/base/hash_value.h"
 #include "net/base/net_export.h"
 #include "net/cert/cert_status_flags.h"
@@ -14,10 +15,6 @@
 #include "net/cert/ocsp_verify_result.h"
 #include "net/cert/signed_certificate_timestamp_and_status.h"
 
-namespace base {
-class Value;
-}
-
 namespace ct {
 enum class CTPolicyCompliance;
 }  // namespace ct
@@ -47,7 +44,7 @@
   // Creates NetLog parameter to describe the CertVerifyResult. |net_error| is
   // a net error code to include in the params, if non-zero. It must not be
   // ERR_IO_PENDING, as that is not a true error.
-  base::Value NetLogParams(int net_error) const;
+  base::Value::Dict NetLogParams(int net_error) const;
 
   // The certificate chain that was constructed during verification.
   //
diff --git a/net/cert/coalescing_cert_verifier.cc b/net/cert/coalescing_cert_verifier.cc
index 7e8376d..8fb4d3e 100644
--- a/net/cert/coalescing_cert_verifier.cc
+++ b/net/cert/coalescing_cert_verifier.cc
@@ -70,7 +70,8 @@
 
 namespace {
 
-base::Value CertVerifierParams(const CertVerifier::RequestParams& params) {
+base::Value::Dict CertVerifierParams(
+    const CertVerifier::RequestParams& params) {
   base::Value::Dict dict;
   dict.Set("certificates",
            NetLogX509CertificateList(params.certificate().get()));
@@ -84,7 +85,7 @@
   dict.Set("host", NetLogStringValue(params.hostname()));
   dict.Set("verifier_flags", params.flags());
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/cert/ct_signed_certificate_timestamp_log_param.cc b/net/cert/ct_signed_certificate_timestamp_log_param.cc
index beb7176..6109dda 100644
--- a/net/cert/ct_signed_certificate_timestamp_log_param.cc
+++ b/net/cert/ct_signed_certificate_timestamp_log_param.cc
@@ -71,16 +71,16 @@
 
 }  // namespace
 
-base::Value NetLogSignedCertificateTimestampParams(
+base::Value::Dict NetLogSignedCertificateTimestampParams(
     const SignedCertificateTimestampAndStatusList* scts) {
   base::Value::Dict dict;
 
   dict.Set("scts", SCTListToPrintableValues(*scts));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogRawSignedCertificateTimestampParams(
+base::Value::Dict NetLogRawSignedCertificateTimestampParams(
     base::StringPiece embedded_scts,
     base::StringPiece sct_list_from_ocsp,
     base::StringPiece sct_list_from_tls_extension) {
@@ -90,7 +90,7 @@
   SetBinaryData("scts_from_ocsp_response", sct_list_from_ocsp, dict);
   SetBinaryData("scts_from_tls_extension", sct_list_from_tls_extension, dict);
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/cert/ct_signed_certificate_timestamp_log_param.h b/net/cert/ct_signed_certificate_timestamp_log_param.h
index dad83fc..d8c814d 100644
--- a/net/cert/ct_signed_certificate_timestamp_log_param.h
+++ b/net/cert/ct_signed_certificate_timestamp_log_param.h
@@ -6,26 +6,23 @@
 #define NET_CERT_CT_SIGNED_CERTIFICATE_TIMESTAMP_LOG_PARAM_H_
 
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "net/cert/signed_certificate_timestamp_and_status.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 // Creates a dictionary of processed Signed Certificate Timestamps to be
 // logged in the NetLog.
 // See the documentation for SIGNED_CERTIFICATE_TIMESTAMPS_CHECKED
 // in net/log/net_log_event_type_list.h
-base::Value NetLogSignedCertificateTimestampParams(
+base::Value::Dict NetLogSignedCertificateTimestampParams(
     const SignedCertificateTimestampAndStatusList* scts);
 
 // Creates a dictionary of raw Signed Certificate Timestamps to be logged
 // in the NetLog.
 // See the documentation for SIGNED_CERTIFICATE_TIMESTAMPS_RECEIVED
 // in net/log/net_log_event_type_list.h
-base::Value NetLogRawSignedCertificateTimestampParams(
+base::Value::Dict NetLogRawSignedCertificateTimestampParams(
     base::StringPiece embedded_scts,
     base::StringPiece sct_list_from_ocsp,
     base::StringPiece sct_list_from_tls_extension);
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc
index 0be1e70..19e716de 100644
--- a/net/cert/multi_log_ct_verifier_unittest.cc
+++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -82,10 +82,11 @@
       return false;
 
     const NetLogEntry& parsed = entries[1];
-    if (!parsed.params.is_dict())
+    if (parsed.params.empty()) {
       return false;
+    }
 
-    const base::Value::List* scts = parsed.params.GetDict().FindList("scts");
+    const base::Value::List* scts = parsed.params.FindList("scts");
     if (!scts || scts->size() != 1)
       return false;
 
diff --git a/net/cert/trial_comparison_cert_verifier.cc b/net/cert/trial_comparison_cert_verifier.cc
index f6853e91..073dce3 100644
--- a/net/cert/trial_comparison_cert_verifier.cc
+++ b/net/cert/trial_comparison_cert_verifier.cc
@@ -29,10 +29,10 @@
 
 namespace {
 
-base::Value JobResultParams(bool trial_success) {
+base::Value::Dict JobResultParams(bool trial_success) {
   base::Value::Dict results;
   results.Set("trial_success", trial_success);
-  return base::Value(std::move(results));
+  return results;
 }
 
 }  // namespace
diff --git a/net/cookies/cookie_monster_netlog_params.cc b/net/cookies/cookie_monster_netlog_params.cc
index 93dfe253..7f7660606 100644
--- a/net/cookies/cookie_monster_netlog_params.cc
+++ b/net/cookies/cookie_monster_netlog_params.cc
@@ -9,17 +9,18 @@
 
 namespace net {
 
-base::Value NetLogCookieMonsterConstructorParams(bool persistent_store) {
+base::Value::Dict NetLogCookieMonsterConstructorParams(bool persistent_store) {
   base::Value::Dict dict;
   dict.Set("persistent_store", persistent_store);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogCookieMonsterCookieAdded(const CanonicalCookie* cookie,
-                                           bool sync_requested,
-                                           NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogCookieMonsterCookieAdded(
+    const CanonicalCookie* cookie,
+    bool sync_requested,
+    NetLogCaptureMode capture_mode) {
   if (!NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
 
   base::Value::Dict dict;
   dict.Set("name", cookie->Name());
@@ -33,15 +34,16 @@
   dict.Set("is_persistent", cookie->IsPersistent());
   dict.Set("sync_requested", sync_requested);
   dict.Set("same_party", cookie->IsSameParty());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogCookieMonsterCookieDeleted(const CanonicalCookie* cookie,
-                                             CookieChangeCause cause,
-                                             bool sync_requested,
-                                             NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogCookieMonsterCookieDeleted(
+    const CanonicalCookie* cookie,
+    CookieChangeCause cause,
+    bool sync_requested,
+    NetLogCaptureMode capture_mode) {
   if (!NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
 
   base::Value::Dict dict;
   dict.Set("name", cookie->Name());
@@ -51,15 +53,15 @@
   dict.Set("is_persistent", cookie->IsPersistent());
   dict.Set("deletion_cause", CookieChangeCauseToString(cause));
   dict.Set("sync_requested", sync_requested);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogCookieMonsterCookieRejectedSecure(
+base::Value::Dict NetLogCookieMonsterCookieRejectedSecure(
     const CanonicalCookie* old_cookie,
     const CanonicalCookie* new_cookie,
     NetLogCaptureMode capture_mode) {
   if (!NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
   base::Value::Dict dict;
   dict.Set("name", old_cookie->Name());
   dict.Set("domain", old_cookie->Domain());
@@ -67,31 +69,31 @@
   dict.Set("newpath", new_cookie->Path());
   dict.Set("oldvalue", old_cookie->Value());
   dict.Set("newvalue", new_cookie->Value());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogCookieMonsterCookieRejectedHttponly(
+base::Value::Dict NetLogCookieMonsterCookieRejectedHttponly(
     const CanonicalCookie* old_cookie,
     const CanonicalCookie* new_cookie,
     NetLogCaptureMode capture_mode) {
   if (!NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
   base::Value::Dict dict;
   dict.Set("name", old_cookie->Name());
   dict.Set("domain", old_cookie->Domain());
   dict.Set("path", old_cookie->Path());
   dict.Set("oldvalue", old_cookie->Value());
   dict.Set("newvalue", new_cookie->Value());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogCookieMonsterCookiePreservedSkippedSecure(
+base::Value::Dict NetLogCookieMonsterCookiePreservedSkippedSecure(
     const CanonicalCookie* skipped_secure,
     const CanonicalCookie* preserved,
     const CanonicalCookie* new_cookie,
     NetLogCaptureMode capture_mode) {
   if (!NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
   base::Value::Dict dict;
   dict.Set("name", preserved->Name());
   dict.Set("domain", preserved->Domain());
@@ -100,7 +102,7 @@
   dict.Set("securecookiepath", skipped_secure->Path());
   dict.Set("preservedvalue", preserved->Value());
   dict.Set("discardedvalue", new_cookie->Value());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/cookies/cookie_monster_netlog_params.h b/net/cookies/cookie_monster_netlog_params.h
index f3728da5..c413c316 100644
--- a/net/cookies/cookie_monster_netlog_params.h
+++ b/net/cookies/cookie_monster_netlog_params.h
@@ -16,29 +16,31 @@
 
 // Returns a Value containing NetLog parameters for constructing
 // a CookieMonster.
-base::Value NetLogCookieMonsterConstructorParams(bool persistent_store);
+base::Value::Dict NetLogCookieMonsterConstructorParams(bool persistent_store);
 
 // Returns a Value containing NetLog parameters for adding a cookie.
-base::Value NetLogCookieMonsterCookieAdded(const CanonicalCookie* cookie,
-                                           bool sync_requested,
-                                           NetLogCaptureMode capture_mode);
+base::Value::Dict NetLogCookieMonsterCookieAdded(
+    const CanonicalCookie* cookie,
+    bool sync_requested,
+    NetLogCaptureMode capture_mode);
 
 // Returns a Value containing NetLog parameters for deleting a cookie.
-base::Value NetLogCookieMonsterCookieDeleted(const CanonicalCookie* cookie,
-                                             CookieChangeCause cause,
-                                             bool sync_requested,
-                                             NetLogCaptureMode capture_mode);
+base::Value::Dict NetLogCookieMonsterCookieDeleted(
+    const CanonicalCookie* cookie,
+    CookieChangeCause cause,
+    bool sync_requested,
+    NetLogCaptureMode capture_mode);
 
 // Returns a Value containing NetLog parameters for when a cookie addition
 // is rejected because of a conflict with a secure cookie.
-base::Value NetLogCookieMonsterCookieRejectedSecure(
+base::Value::Dict NetLogCookieMonsterCookieRejectedSecure(
     const CanonicalCookie* old_cookie,
     const CanonicalCookie* new_cookie,
     NetLogCaptureMode capture_mode);
 
 // Returns a Value containing NetLog parameters for when a cookie addition
 // is rejected because of a conflict with an httponly cookie.
-base::Value NetLogCookieMonsterCookieRejectedHttponly(
+base::Value::Dict NetLogCookieMonsterCookieRejectedHttponly(
     const CanonicalCookie* old_cookie,
     const CanonicalCookie* new_cookie,
     NetLogCaptureMode capture_mode);
@@ -47,7 +49,7 @@
 // cookie addition which is rejected due to a conflict with a secure cookie, a
 // pre-existing cookie would have been deleted but is instead preserved because
 // the addition failed.
-base::Value NetLogCookieMonsterCookiePreservedSkippedSecure(
+base::Value::Dict NetLogCookieMonsterCookiePreservedSkippedSecure(
     const CanonicalCookie* skipped_secure,
     const CanonicalCookie* preserved,
     const CanonicalCookie* new_cookie,
diff --git a/net/disk_cache/memory/mem_entry_impl.cc b/net/disk_cache/memory/mem_entry_impl.cc
index e62ed1b..d7bfeba 100644
--- a/net/disk_cache/memory/mem_entry_impl.cc
+++ b/net/disk_cache/memory/mem_entry_impl.cc
@@ -57,7 +57,7 @@
 
 // Returns NetLog parameters for the creation of a MemEntryImpl. A separate
 // function is needed because child entries don't store their key().
-base::Value NetLogEntryCreationParams(const MemEntryImpl* entry) {
+base::Value::Dict NetLogEntryCreationParams(const MemEntryImpl* entry) {
   base::Value::Dict dict;
   std::string key;
   switch (entry->type()) {
@@ -70,7 +70,7 @@
   }
   dict.Set("key", key);
   dict.Set("created", true);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/disk_cache/net_log_parameters.cc b/net/disk_cache/net_log_parameters.cc
index 377adb4d..6f14bf9 100644
--- a/net/disk_cache/net_log_parameters.cc
+++ b/net/disk_cache/net_log_parameters.cc
@@ -15,20 +15,20 @@
 
 namespace {
 
-base::Value NetLogReadWriteDataParams(int index,
-                                      int offset,
-                                      int buf_len,
-                                      bool truncate) {
+base::Value::Dict NetLogReadWriteDataParams(int index,
+                                            int offset,
+                                            int buf_len,
+                                            bool truncate) {
   base::Value::Dict dict;
   dict.Set("index", index);
   dict.Set("offset", offset);
   dict.Set("buf_len", buf_len);
   if (truncate)
     dict.Set("truncate", truncate);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogReadWriteCompleteParams(int bytes_copied) {
+base::Value::Dict NetLogReadWriteCompleteParams(int bytes_copied) {
   DCHECK_NE(bytes_copied, net::ERR_IO_PENDING);
   base::Value::Dict dict;
   if (bytes_copied < 0) {
@@ -36,35 +36,35 @@
   } else {
     dict.Set("bytes_copied", bytes_copied);
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSparseOperationParams(int64_t offset, int buf_len) {
+base::Value::Dict NetLogSparseOperationParams(int64_t offset, int buf_len) {
   base::Value::Dict dict;
   dict.Set("offset", net::NetLogNumberValue(offset));
   dict.Set("buf_len", buf_len);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSparseReadWriteParams(const net::NetLogSource& source,
-                                        int child_len) {
+base::Value::Dict NetLogSparseReadWriteParams(const net::NetLogSource& source,
+                                              int child_len) {
   base::Value::Dict dict;
   source.AddToEventParameters(dict);
   dict.Set("child_len", child_len);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
 
 namespace disk_cache {
 
-base::Value CreateNetLogParametersEntryCreationParams(const Entry* entry,
-                                                      bool created) {
+base::Value::Dict CreateNetLogParametersEntryCreationParams(const Entry* entry,
+                                                            bool created) {
   DCHECK(entry);
   base::Value::Dict dict;
   dict.Set("key", entry->GetKey());
   dict.Set("created", created);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void NetLogReadWriteData(const net::NetLogWithSource& net_log,
@@ -107,7 +107,7 @@
   });
 }
 
-base::Value CreateNetLogGetAvailableRangeResultParams(
+base::Value::Dict CreateNetLogGetAvailableRangeResultParams(
     disk_cache::RangeResult result) {
   base::Value::Dict dict;
   if (result.net_error == net::OK) {
@@ -116,7 +116,7 @@
   } else {
     dict.Set("net_error", result.net_error);
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace disk_cache
diff --git a/net/disk_cache/net_log_parameters.h b/net/disk_cache/net_log_parameters.h
index 6a5499f..e508a62 100644
--- a/net/disk_cache/net_log_parameters.h
+++ b/net/disk_cache/net_log_parameters.h
@@ -7,6 +7,7 @@
 
 #include <stdint.h>
 
+#include "base/values.h"
 #include "net/disk_cache/disk_cache.h"
 #include "net/log/net_log_with_source.h"
 
@@ -14,10 +15,6 @@
 struct NetLogSource;
 }
 
-namespace base {
-class Value;
-}
-
 // This file contains a set of functions to create NetLogParametersCallbacks
 // shared by EntryImpls and MemEntryImpls.
 namespace disk_cache {
@@ -27,8 +24,8 @@
 // Creates NetLog parameters for the creation of an Entry.  Contains the Entry's
 // key and whether it was created or opened. |entry| can't be nullptr, must
 // support GetKey().
-base::Value CreateNetLogParametersEntryCreationParams(const Entry* entry,
-                                                      bool created);
+base::Value::Dict CreateNetLogParametersEntryCreationParams(const Entry* entry,
+                                                            bool created);
 
 // Logs an event for the start of a non-sparse read or write of an Entry. For
 // reads, |truncate| must be false.
@@ -64,7 +61,7 @@
                            int child_len);
 
 // Creates NetLog parameters for when a call to GetAvailableRange returns.
-base::Value CreateNetLogGetAvailableRangeResultParams(
+base::Value::Dict CreateNetLogGetAvailableRangeResultParams(
     const disk_cache::RangeResult result);
 
 }  // namespace disk_cache
diff --git a/net/disk_cache/simple/simple_net_log_parameters.cc b/net/disk_cache/simple/simple_net_log_parameters.cc
index 6e31ac6e..53ebec6 100644
--- a/net/disk_cache/simple/simple_net_log_parameters.cc
+++ b/net/disk_cache/simple/simple_net_log_parameters.cc
@@ -18,22 +18,22 @@
 
 namespace {
 
-base::Value NetLogSimpleEntryConstructionParams(
+base::Value::Dict NetLogSimpleEntryConstructionParams(
     const disk_cache::SimpleEntryImpl* entry) {
   base::Value::Dict dict;
   dict.Set("entry_hash",
            base::StringPrintf("%#016" PRIx64, entry->entry_hash()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSimpleEntryCreationParams(
+base::Value::Dict NetLogSimpleEntryCreationParams(
     const disk_cache::SimpleEntryImpl* entry,
     int net_error) {
   base::Value::Dict dict;
   dict.Set("net_error", net_error);
   if (net_error == net::OK)
     dict.Set("key", entry->key());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/dns/context_host_resolver.cc b/net/dns/context_host_resolver.cc
index 066fc00..aa5d8cc 100644
--- a/net/dns/context_host_resolver.cc
+++ b/net/dns/context_host_resolver.cc
@@ -119,7 +119,7 @@
   return resolve_context_->host_cache();
 }
 
-base::Value ContextHostResolver::GetDnsConfigAsValue() const {
+base::Value::Dict ContextHostResolver::GetDnsConfigAsValue() const {
   return manager_->GetDnsConfigAsValue();
 }
 
diff --git a/net/dns/context_host_resolver.h b/net/dns/context_host_resolver.h
index 49d161e..1e8c135 100644
--- a/net/dns/context_host_resolver.h
+++ b/net/dns/context_host_resolver.h
@@ -11,6 +11,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/sequence_checker.h"
+#include "base/values.h"
 #include "net/base/net_export.h"
 #include "net/base/network_handle.h"
 #include "net/base/network_isolation_key.h"
@@ -69,7 +70,7 @@
       const HostPortPair& host,
       DnsQueryType query_type) override;
   HostCache* GetHostCache() override;
-  base::Value GetDnsConfigAsValue() const override;
+  base::Value::Dict GetDnsConfigAsValue() const override;
   void SetRequestContext(URLRequestContext* request_context) override;
   HostResolverManager* GetManagerForTesting() override;
   const URLRequestContext* GetContextForTesting() const override;
diff --git a/net/dns/dns_client.cc b/net/dns/dns_client.cc
index d8e9ca7..db550a7b 100644
--- a/net/dns/dns_client.cc
+++ b/net/dns/dns_client.cc
@@ -215,17 +215,15 @@
     insecure_fallback_failures_ = 0;
   }
 
-  base::Value GetDnsConfigAsValueForNetLog() const override {
+  base::Value::Dict GetDnsConfigAsValueForNetLog() const override {
     const DnsConfig* config = GetEffectiveConfig();
     if (config == nullptr)
-      return base::Value(base::Value::Dict());
-    base::Value value = config->ToValue();
-    DCHECK(value.is_dict());
-    base::Value::Dict& dict = value.GetDict();
+      return base::Value::Dict();
+    base::Value::Dict dict = config->ToDict();
     dict.Set("can_use_secure_dns_transactions", CanUseSecureDnsTransactions());
     dict.Set("can_use_insecure_dns_transactions",
              CanUseInsecureDnsTransactions());
-    return value;
+    return dict;
   }
 
   absl::optional<DnsConfig> GetSystemConfigForTesting() const override {
diff --git a/net/dns/dns_client.h b/net/dns/dns_client.h
index 4d6fb19..25dc4d9 100644
--- a/net/dns/dns_client.h
+++ b/net/dns/dns_client.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/values.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_export.h"
 #include "net/base/rand_callback.h"
@@ -103,7 +104,7 @@
   // Return the effective DNS configuration as a value that can be recorded in
   // the NetLog. This also synthesizes interpretative data to the Value, e.g.
   // whether secure and insecure transactions are enabled.
-  virtual base::Value GetDnsConfigAsValueForNetLog() const = 0;
+  virtual base::Value::Dict GetDnsConfigAsValueForNetLog() const = 0;
 
   virtual absl::optional<DnsConfig> GetSystemConfigForTesting() const = 0;
   virtual DnsConfigOverrides GetConfigOverridesForTesting() const = 0;
diff --git a/net/dns/dns_config.cc b/net/dns/dns_config.cc
index c099f05..2b1214a 100644
--- a/net/dns/dns_config.cc
+++ b/net/dns/dns_config.cc
@@ -73,7 +73,7 @@
   allow_dns_over_https_upgrade = d.allow_dns_over_https_upgrade;
 }
 
-base::Value DnsConfig::ToValue() const {
+base::Value::Dict DnsConfig::ToDict() const {
   base::Value::Dict dict;
 
   base::Value::List nameserver_list;
@@ -101,7 +101,7 @@
   dict.Set("secure_dns_mode", base::strict_cast<int>(secure_dns_mode));
   dict.Set("allow_dns_over_https_upgrade", allow_dns_over_https_upgrade);
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/dns/dns_config.h b/net/dns/dns_config.h
index fffb31c..73e02b59 100644
--- a/net/dns/dns_config.h
+++ b/net/dns/dns_config.h
@@ -10,16 +10,13 @@
 #include <vector>
 
 #include "base/time/time.h"
+#include "base/values.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/net_export.h"
 #include "net/dns/dns_hosts.h"
 #include "net/dns/public/dns_over_https_config.h"
 #include "net/dns/public/secure_dns_mode.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 constexpr base::TimeDelta kDnsDefaultFallbackPeriod = base::Seconds(1);
@@ -43,9 +40,9 @@
 
   void CopyIgnoreHosts(const DnsConfig& src);
 
-  // Returns a Value representation of |this|. For performance reasons, the
-  // Value only contains the number of hosts rather than the full list.
-  base::Value ToValue() const;
+  // Returns a Dict representation of |this|. For performance reasons, the
+  // Dict only contains the number of hosts rather than the full list.
+  base::Value::Dict ToDict() const;
 
   bool IsValid() const {
     return !nameservers.empty() || !doh_config.servers().empty();
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc
index 91afaf30f..92510f81 100644
--- a/net/dns/dns_test_util.cc
+++ b/net/dns/dns_test_util.cc
@@ -763,9 +763,9 @@
   return effective_config_.has_value() ? &effective_config_.value() : nullptr;
 }
 
-base::Value MockDnsClient::GetDnsConfigAsValueForNetLog() const {
+base::Value::Dict MockDnsClient::GetDnsConfigAsValueForNetLog() const {
   // This is just a stub implementation that never produces a meaningful value.
-  return base::Value(base::Value::Dict());
+  return base::Value::Dict();
 }
 
 const DnsHosts* MockDnsClient::GetHosts() const {
diff --git a/net/dns/dns_test_util.h b/net/dns/dns_test_util.h
index 51955ca5..1a6fa5c89 100644
--- a/net/dns/dns_test_util.h
+++ b/net/dns/dns_test_util.h
@@ -19,6 +19,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "net/base/connection_endpoint_metadata.h"
 #include "net/base/ip_endpoint.h"
 #include "net/dns/dns_client.h"
@@ -413,7 +414,7 @@
   AddressSorter* GetAddressSorter() override;
   void IncrementInsecureFallbackFailures() override;
   void ClearInsecureFallbackFailures() override;
-  base::Value GetDnsConfigAsValueForNetLog() const override;
+  base::Value::Dict GetDnsConfigAsValueForNetLog() const override;
   absl::optional<DnsConfig> GetSystemConfigForTesting() const override;
   DnsConfigOverrides GetConfigOverridesForTesting() const override;
   void SetTransactionFactoryForTesting(
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index 1ba2317..fbcb25b 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -125,11 +125,12 @@
   return ip.AssignFromIPLiteral(hostname);
 }
 
-base::Value NetLogStartParams(const std::string& hostname, uint16_t qtype) {
+base::Value::Dict NetLogStartParams(const std::string& hostname,
+                                    uint16_t qtype) {
   base::Value::Dict dict;
   dict.Set("hostname", hostname);
   dict.Set("query_type", qtype);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // ----------------------------------------------------------------------------
@@ -168,7 +169,7 @@
   // Returns a Value representing the received response, along with a reference
   // to the NetLog source source of the UDP socket used.  The request must have
   // completed before this is called.
-  base::Value NetLogResponseParams(NetLogCaptureMode capture_mode) const {
+  base::Value::Dict NetLogResponseParams(NetLogCaptureMode capture_mode) const {
     base::Value::Dict dict;
 
     if (GetResponse()) {
@@ -185,7 +186,7 @@
       dict.Set("response_buffer", GetRawResponseBufferForLog());
     }
 
-    return base::Value(std::move(dict));
+    return dict;
   }
 
   // True if current attempt is pending (waiting for server response).
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index 696f6ff..a4f19aa 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -95,8 +95,9 @@
 
   void OnAddEntry(const NetLogEntry& entry) override {
     ++count_;
-    if (!entry.params.is_none() && entry.params.is_dict())
+    if (!entry.params.empty()) {
       dict_count_++;
+    }
   }
 
   int count() const { return count_; }
diff --git a/net/dns/host_resolver.cc b/net/dns/host_resolver.cc
index 951730b..d258486 100644
--- a/net/dns/host_resolver.cc
+++ b/net/dns/host_resolver.cc
@@ -316,8 +316,8 @@
   return nullptr;
 }
 
-base::Value HostResolver::GetDnsConfigAsValue() const {
-  return base::Value(base::Value::Type::DICT);
+base::Value::Dict HostResolver::GetDnsConfigAsValue() const {
+  return base::Value::Dict();
 }
 
 void HostResolver::SetRequestContext(URLRequestContext* request_context) {
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index 42068d1..cd98dd1 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -14,6 +14,7 @@
 #include <vector>
 
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "net/base/address_family.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/host_port_pair.h"
@@ -34,10 +35,6 @@
 #include "third_party/abseil-cpp/absl/types/variant.h"
 #include "url/scheme_host_port.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class AddressList;
@@ -441,7 +438,7 @@
   virtual HostCache* GetHostCache();
 
   // Returns the current DNS configuration |this| is using, as a Value.
-  virtual base::Value GetDnsConfigAsValue() const;
+  virtual base::Value::Dict GetDnsConfigAsValue() const;
 
   // Set the associated URLRequestContext, generally expected to be called by
   // URLRequestContextBuilder on passing ownership of |this| to a context. May
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 7adb6931..be3efe3 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -255,7 +255,7 @@
 }
 
 // Creates NetLog parameters when the DnsTask failed.
-base::Value NetLogDnsTaskFailedParams(
+base::Value::Dict NetLogDnsTaskFailedParams(
     int net_error,
     absl::optional<DnsQueryType> failed_transaction_type,
     absl::optional<base::TimeDelta> ttl,
@@ -271,10 +271,10 @@
   dict.Set("net_error", net_error);
   if (saved_results)
     dict.Set("saved_results", saved_results->NetLogParams());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogDnsTaskExtractionFailureParams(
+base::Value::Dict NetLogDnsTaskExtractionFailureParams(
     DnsResponseResultExtractor::ExtractionError extraction_error,
     DnsQueryType dns_query_type,
     const HostCache::Entry& results) {
@@ -282,23 +282,23 @@
   dict.Set("extraction_error", base::strict_cast<int>(extraction_error));
   dict.Set("dns_query_type", base::strict_cast<int>(dns_query_type));
   dict.Set("results", results.NetLogParams());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Creates NetLog parameters for HOST_RESOLVER_MANAGER_JOB_ATTACH/DETACH events.
-base::Value NetLogJobAttachParams(const NetLogSource& source,
-                                  RequestPriority priority) {
+base::Value::Dict NetLogJobAttachParams(const NetLogSource& source,
+                                        RequestPriority priority) {
   base::Value::Dict dict;
   source.AddToEventParameters(dict);
   dict.Set("priority", RequestPriorityToString(priority));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogIPv6AvailableParams(bool ipv6_available, bool cached) {
+base::Value::Dict NetLogIPv6AvailableParams(bool ipv6_available, bool cached) {
   base::Value::Dict dict;
   dict.Set("ipv6_available", ipv6_available);
   dict.Set("cached", cached);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // The logging routines are defined here because some requests are resolved
@@ -407,10 +407,10 @@
   size_t counts_[NUM_PRIORITIES] = {};
 };
 
-base::Value NetLogResults(const HostCache::Entry& results) {
+base::Value::Dict NetLogResults(const HostCache::Entry& results) {
   base::Value::Dict dict;
   dict.Set("results", results.NetLogParams());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 base::Value ToLogStringValue(
@@ -762,7 +762,7 @@
                    network_anonymization_key_.ToDebugString());
           dict.Set("secure_dns_policy",
                    base::strict_cast<int>(parameters_.secure_dns_policy));
-          return base::Value(std::move(dict));
+          return dict;
         });
   }
 
@@ -1027,7 +1027,7 @@
     std::unique_ptr<DnsTransaction> transaction;
   };
 
-  base::Value NetLogDnsTaskCreationParams() {
+  base::Value::Dict NetLogDnsTaskCreationParams() {
     base::Value::Dict dict;
     dict.Set("secure", secure());
 
@@ -1039,10 +1039,10 @@
     }
     dict.Set("transactions_needed", std::move(transactions_needed_value));
 
-    return base::Value(std::move(dict));
+    return dict;
   }
 
-  base::Value NetLogDnsTaskTimeoutParams() {
+  base::Value::Dict NetLogDnsTaskTimeoutParams() {
     base::Value::Dict dict;
 
     if (!transactions_in_progress_.empty()) {
@@ -1067,7 +1067,7 @@
       dict.Set("queued_transactions", std::move(list));
     }
 
-    return base::Value(std::move(dict));
+    return dict;
   }
 
   DnsQueryTypeSet MaybeDisableAdditionalQueries(DnsQueryTypeSet types) {
@@ -2085,7 +2085,7 @@
   }
 
  private:
-  base::Value NetLogJobCreationParams(const NetLogSource& source) {
+  base::Value::Dict NetLogJobCreationParams(const NetLogSource& source) {
     base::Value::Dict dict;
     source.AddToEventParameters(dict);
     dict.Set("host", ToLogStringValue(key_.host));
@@ -2096,7 +2096,7 @@
     dict.Set("secure_dns_mode", base::strict_cast<int>(key_.secure_dns_mode));
     dict.Set("network_anonymization_key",
              key_.network_anonymization_key.ToDebugString());
-    return base::Value(std::move(dict));
+    return dict;
   }
 
   void Finish() {
@@ -2942,10 +2942,10 @@
   }
 }
 
-base::Value HostResolverManager::GetDnsConfigAsValue() const {
+base::Value::Dict HostResolverManager::GetDnsConfigAsValue() const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   return dns_client_ ? dns_client_->GetDnsConfigAsValueForNetLog()
-                     : base::Value(base::Value::Dict());
+                     : base::Value::Dict();
 }
 
 void HostResolverManager::SetDnsConfigOverrides(DnsConfigOverrides overrides) {
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index 1457a742..14044355 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -24,6 +24,7 @@
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/network_anonymization_key.h"
@@ -178,7 +179,7 @@
   virtual void SetInsecureDnsClientEnabled(bool enabled,
                                            bool additional_dns_types_enabled);
 
-  base::Value GetDnsConfigAsValue() const;
+  base::Value::Dict GetDnsConfigAsValue() const;
 
   // Sets overriding configuration that will replace or add to configuration
   // read from the system for DnsClient resolution.
diff --git a/net/dns/host_resolver_system_task.cc b/net/dns/host_resolver_system_task.cc
index 9240d8f3..fb07225 100644
--- a/net/dns/host_resolver_system_task.cc
+++ b/net/dns/host_resolver_system_task.cc
@@ -116,9 +116,10 @@
 }
 
 // Creates NetLog parameters when the resolve failed.
-base::Value NetLogHostResolverSystemTaskFailedParams(uint32_t attempt_number,
-                                                     int net_error,
-                                                     int os_error) {
+base::Value::Dict NetLogHostResolverSystemTaskFailedParams(
+    uint32_t attempt_number,
+    int net_error,
+    int os_error) {
   base::Value::Dict dict;
   if (attempt_number)
     dict.Set("attempt_number", base::saturated_cast<int>(attempt_number));
@@ -144,7 +145,7 @@
 #endif
   }
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 using SystemDnsResolverOverrideCallback =
diff --git a/net/dns/mapped_host_resolver.cc b/net/dns/mapped_host_resolver.cc
index 9ebbb804..9112a86 100644
--- a/net/dns/mapped_host_resolver.cc
+++ b/net/dns/mapped_host_resolver.cc
@@ -84,7 +84,7 @@
   return impl_->GetHostCache();
 }
 
-base::Value MappedHostResolver::GetDnsConfigAsValue() const {
+base::Value::Dict MappedHostResolver::GetDnsConfigAsValue() const {
   return impl_->GetDnsConfigAsValue();
 }
 
diff --git a/net/dns/mapped_host_resolver.h b/net/dns/mapped_host_resolver.h
index 9cd0b36..92ffdf2 100644
--- a/net/dns/mapped_host_resolver.h
+++ b/net/dns/mapped_host_resolver.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/host_mapping_rules.h"
 #include "net/base/net_export.h"
@@ -67,7 +68,7 @@
       override;
   std::unique_ptr<ProbeRequest> CreateDohProbeRequest() override;
   HostCache* GetHostCache() override;
-  base::Value GetDnsConfigAsValue() const override;
+  base::Value::Dict GetDnsConfigAsValue() const override;
   void SetRequestContext(URLRequestContext* request_context) override;
   HostResolverManager* GetManagerForTesting() override;
 
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
index 89aa1536..c24872a 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
@@ -49,13 +49,14 @@
 
 namespace {
 
-base::Value CookieKeyedLoadNetLogParams(const std::string& key,
-                                        net::NetLogCaptureMode capture_mode) {
+base::Value::Dict CookieKeyedLoadNetLogParams(
+    const std::string& key,
+    net::NetLogCaptureMode capture_mode) {
   if (!net::NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
+    return base::Value::Dict();
   base::Value::Dict dict;
   dict.Set("key", key);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Used to populate a histogram for problems when loading cookies.
diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc
index fd1b8da..bf1a314 100644
--- a/net/http/bidirectional_stream.cc
+++ b/net/http/bidirectional_stream.cc
@@ -37,24 +37,24 @@
 
 namespace {
 
-base::Value NetLogHeadersParams(const spdy::Http2HeaderBlock* headers,
-                                NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogHeadersParams(const spdy::Http2HeaderBlock* headers,
+                                      NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogParams(const GURL& url,
-                         const std::string& method,
-                         const HttpRequestHeaders* headers,
-                         NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogParams(const GURL& url,
+                               const std::string& method,
+                               const HttpRequestHeaders* headers,
+                               NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("url", url.possibly_invalid_spec());
   dict.Set("method", method);
   base::Value headers_param(
       headers->NetLogParams(/*request_line=*/std::string(), capture_mode));
   dict.Set("headers", std::move(headers_param));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/http/http_auth.cc b/net/http/http_auth.cc
index aa64f0a..e7b227b 100644
--- a/net/http/http_auth.cc
+++ b/net/http/http_auth.cc
@@ -183,7 +183,7 @@
 }
 
 // static
-base::Value HttpAuth::NetLogAuthorizationResultParams(
+base::Value::Dict HttpAuth::NetLogAuthorizationResultParams(
     const char* name,
     AuthorizationResult authorization_result) {
   return NetLogParamsWithString(
diff --git a/net/http/http_auth.h b/net/http/http_auth.h
index 9698ffa..56cdb0a2 100644
--- a/net/http/http_auth.h
+++ b/net/http/http_auth.h
@@ -9,15 +9,12 @@
 #include <set>
 #include <string>
 
+#include "base/values.h"
 #include "net/base/auth.h"
 #include "net/base/net_export.h"
 
 template <class T> class scoped_refptr;
 
-namespace base {
-class Value;
-}
-
 namespace url {
 class SchemeHostPort;
 }
@@ -157,7 +154,7 @@
       AuthorizationResult authorization_result);
 
   // Returns a value for logging an authorization result to a NetLog.
-  static base::Value NetLogAuthorizationResultParams(
+  static base::Value::Dict NetLogAuthorizationResultParams(
       const char* name,
       AuthorizationResult authorization_result);
 
diff --git a/net/http/http_auth_controller.cc b/net/http/http_auth_controller.cc
index 597880a5..a61156d5 100644
--- a/net/http/http_auth_controller.cc
+++ b/net/http/http_auth_controller.cc
@@ -31,11 +31,12 @@
 
 namespace {
 
-base::Value ControllerParamsToValue(HttpAuth::Target target, const GURL& url) {
+base::Value::Dict ControllerParamsToValue(HttpAuth::Target target,
+                                          const GURL& url) {
   base::Value::Dict params;
   params.Set("target", HttpAuth::GetAuthTargetString(target));
   params.Set("url", url.spec());
-  return base::Value(std::move(params));
+  return params;
 }
 
 }  // namespace
diff --git a/net/http/http_auth_gssapi_posix.cc b/net/http/http_auth_gssapi_posix.cc
index bd220b7..7d25a79a 100644
--- a/net/http/http_auth_gssapi_posix.cc
+++ b/net/http/http_auth_gssapi_posix.cc
@@ -271,12 +271,12 @@
   return rv;
 }
 
-base::Value GetContextStateAsValue(GSSAPILibrary* gssapi_lib,
-                                   const gss_ctx_id_t context_handle) {
+base::Value::Dict GetContextStateAsValue(GSSAPILibrary* gssapi_lib,
+                                         const gss_ctx_id_t context_handle) {
   base::Value::Dict rv;
   if (context_handle == GSS_C_NO_CONTEXT) {
     rv.Set("error", GetGssStatusValue(nullptr, "<none>", GSS_S_NO_CONTEXT, 0));
-    return base::Value(std::move(rv));
+    return rv;
   }
 
   OM_uint32 major_status = 0;
@@ -300,7 +300,7 @@
   if (major_status != GSS_S_COMPLETE) {
     rv.Set("error", GetGssStatusValue(gssapi_lib, "gss_inquire_context",
                                       major_status, minor_status));
-    return base::Value(std::move(rv));
+    return rv;
   }
   ScopedName scoped_src_name(src_name, gssapi_lib);
   ScopedName scoped_targ_name(targ_name, gssapi_lib);
@@ -313,19 +313,19 @@
   rv.Set("mechanism", OidToValue(mech_type));
   rv.Set("flags", ContextFlagsToValue(ctx_flags));
   rv.Set("open", !!open);
-  return base::Value(std::move(rv));
+  return rv;
 }
 
 namespace {
 
 // Return a NetLog value for the result of loading a library.
-base::Value LibraryLoadResultParams(base::StringPiece library_name,
-                                    base::StringPiece load_result) {
+base::Value::Dict LibraryLoadResultParams(base::StringPiece library_name,
+                                          base::StringPiece load_result) {
   base::Value::Dict params;
   params.Set("library_name", library_name);
   if (!load_result.empty())
     params.Set("load_result", load_result);
-  return base::Value(std::move(params));
+  return params;
 }
 
 }  // namespace
@@ -421,12 +421,12 @@
 
 namespace {
 
-base::Value BindFailureParams(base::StringPiece library_name,
-                              base::StringPiece method) {
+base::Value::Dict BindFailureParams(base::StringPiece library_name,
+                                    base::StringPiece method) {
   base::Value::Dict params;
   params.Set("library_name", library_name);
   params.Set("method", method);
-  return base::Value(std::move(params));
+  return params;
 }
 
 void* BindUntypedMethod(base::NativeLibrary lib,
@@ -800,29 +800,29 @@
   return ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS;
 }
 
-base::Value ImportNameErrorParams(GSSAPILibrary* library,
-                                  base::StringPiece spn,
-                                  OM_uint32 major_status,
-                                  OM_uint32 minor_status) {
+base::Value::Dict ImportNameErrorParams(GSSAPILibrary* library,
+                                        base::StringPiece spn,
+                                        OM_uint32 major_status,
+                                        OM_uint32 minor_status) {
   base::Value::Dict params;
   params.Set("spn", spn);
   if (major_status != GSS_S_COMPLETE)
     params.Set("status", GetGssStatusValue(library, "import_name", major_status,
                                            minor_status));
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value InitSecContextErrorParams(GSSAPILibrary* library,
-                                      gss_ctx_id_t context,
-                                      OM_uint32 major_status,
-                                      OM_uint32 minor_status) {
+base::Value::Dict InitSecContextErrorParams(GSSAPILibrary* library,
+                                            gss_ctx_id_t context,
+                                            OM_uint32 major_status,
+                                            OM_uint32 minor_status) {
   base::Value::Dict params;
   if (major_status != GSS_S_COMPLETE)
     params.Set("status", GetGssStatusValue(library, "gss_init_sec_context",
                                            major_status, minor_status));
   if (context != GSS_C_NO_CONTEXT)
     params.Set("context", GetContextStateAsValue(library, context));
-  return base::Value(std::move(params));
+  return params;
 }
 
 }  // anonymous namespace
diff --git a/net/http/http_auth_gssapi_posix.h b/net/http/http_auth_gssapi_posix.h
index 903a1b72..bc3077b 100644
--- a/net/http/http_auth_gssapi_posix.h
+++ b/net/http/http_auth_gssapi_posix.h
@@ -283,7 +283,7 @@
 // encapsulating the codes as well as their meanings as expanded via
 // gss_display_status().
 //
-// The base::Value has the following structure:
+// The base::Value::Dict has the following structure:
 //   {
 //     "function": <name of GSSAPI function that returned the error>
 //     "major_status": {
@@ -341,8 +341,8 @@
     GSSAPILibrary* gssapi_lib,
     const gss_name_t gss_name);
 
-// GetContextStateAsValue returns a base::Value that describes the state of a
-// GSSAPI context. The structure of the value is:
+// GetContextStateAsValue returns a base::Value::Dict that describes the state
+// of a GSSAPI context. The structure of the value is:
 //
 //   {
 //     "source": {
@@ -364,7 +364,7 @@
 //   {
 //     "error": <error. See GetGssStatusValue() for structure.>
 //   }
-NET_EXPORT_PRIVATE base::Value GetContextStateAsValue(
+NET_EXPORT_PRIVATE base::Value::Dict GetContextStateAsValue(
     GSSAPILibrary* gssapi_lib,
     const gss_ctx_id_t context_handle);
 }  // namespace net
diff --git a/net/http/http_auth_gssapi_posix_unittest.cc b/net/http/http_auth_gssapi_posix_unittest.cc
index 90cb4ac..f5b9140d 100644
--- a/net/http/http_auth_gssapi_posix_unittest.cc
+++ b/net/http/http_auth_gssapi_posix_unittest.cc
@@ -311,7 +311,7 @@
       NetLogEventPhase::END);
   ASSERT_LT(offset, entries.size());
   const std::string* source =
-      entries[offset].params.FindStringPath("context.source.name");
+      entries[offset].params.FindStringByDottedPath("context.source.name");
   ASSERT_TRUE(source);
   EXPECT_EQ("localhost", *source);
 }
diff --git a/net/http/http_auth_handler.cc b/net/http/http_auth_handler.cc
index c3a516b..d2ff58b 100644
--- a/net/http/http_auth_handler.cc
+++ b/net/http/http_auth_handler.cc
@@ -40,7 +40,7 @@
     base::Value::Dict params;
     params.Set("succeeded", ok);
     params.Set("allows_default_credentials", AllowsDefaultCredentials());
-    return base::Value(std::move(params));
+    return params;
   });
 
   // Init() is expected to set the scheme, realm, score, and properties.  The
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc
index a88617f6..b334186 100644
--- a/net/http/http_auth_handler_factory.cc
+++ b/net/http/http_auth_handler_factory.cc
@@ -31,7 +31,7 @@
 
 namespace {
 
-base::Value NetLogParamsForCreateAuth(
+base::Value::Dict NetLogParamsForCreateAuth(
     const std::string& scheme,
     const std::string& challenge,
     const int net_error,
@@ -47,7 +47,7 @@
     dict.Set("allows_default_credentials", *allows_default_credentials);
   if (net_error < 0)
     dict.Set("net_error", net_error);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/http/http_auth_handler_factory_unittest.cc b/net/http/http_auth_handler_factory_unittest.cc
index 2143419..60545ad 100644
--- a/net/http/http_auth_handler_factory_unittest.cc
+++ b/net/http/http_auth_handler_factory_unittest.cc
@@ -382,12 +382,10 @@
       auto entries = net_log_observer.GetEntriesWithType(
           NetLogEventType::AUTH_HANDLER_CREATE_RESULT);
       ASSERT_EQ(1u, entries.size());
-      const std::string* scheme =
-          entries[0].params.GetDict().FindString("scheme");
+      const std::string* scheme = entries[0].params.FindString("scheme");
       ASSERT_NE(nullptr, scheme);
       EXPECT_STRCASEEQ(test_case.expected_scheme, scheme->data());
-      absl::optional<int> net_error =
-          entries[0].params.GetDict().FindInt("net_error");
+      absl::optional<int> net_error = entries[0].params.FindInt("net_error");
       if (test_case.expected_net_error) {
         ASSERT_TRUE(net_error.has_value());
         EXPECT_EQ(test_case.expected_net_error, net_error.value());
@@ -396,8 +394,7 @@
       }
 
       // The challenge should be logged only when sensitive logging is enabled.
-      const std::string* challenge =
-          entries[0].params.GetDict().FindString("challenge");
+      const std::string* challenge = entries[0].params.FindString("challenge");
       if (capture_mode == NetLogCaptureMode::kDefault) {
         ASSERT_EQ(nullptr, challenge);
       } else {
diff --git a/net/http/http_auth_handler_negotiate.cc b/net/http/http_auth_handler_negotiate.cc
index c79ae8b7d..97871db7 100644
--- a/net/http/http_auth_handler_negotiate.cc
+++ b/net/http/http_auth_handler_negotiate.cc
@@ -37,16 +37,16 @@
 
 namespace {
 
-base::Value NetLogParameterChannelBindings(
+base::Value::Dict NetLogParameterChannelBindings(
     const std::string& channel_binding_token,
     NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   if (!NetLogCaptureIncludesSocketBytes(capture_mode))
-    return base::Value(std::move(dict));
+    return dict;
 
   dict.Set("token", base::HexEncode(channel_binding_token.data(),
                                     channel_binding_token.size()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Uses |negotiate_auth_system_factory| to create the auth system, otherwise
diff --git a/net/http/http_auth_sspi_win.cc b/net/http/http_auth_sspi_win.cc
index 6de1653..4eefb8d 100644
--- a/net/http/http_auth_sspi_win.cc
+++ b/net/http/http_auth_sspi_win.cc
@@ -27,37 +27,38 @@
 
 namespace {
 
-base::Value SecurityStatusToValue(Error mapped_error, SECURITY_STATUS status) {
+base::Value::Dict SecurityStatusToValue(Error mapped_error,
+                                        SECURITY_STATUS status) {
   base::Value::Dict params;
   params.Set("net_error", mapped_error);
   params.Set("security_status", static_cast<int>(status));
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value AcquireCredentialsHandleParams(const std::u16string* domain,
-                                           const std::u16string* user,
-                                           Error result,
-                                           SECURITY_STATUS status) {
+base::Value::Dict AcquireCredentialsHandleParams(const std::u16string* domain,
+                                                 const std::u16string* user,
+                                                 Error result,
+                                                 SECURITY_STATUS status) {
   base::Value::Dict params;
   if (domain && user) {
     params.Set("domain", base::UTF16ToUTF8(*domain));
     params.Set("user", base::UTF16ToUTF8(*user));
   }
   params.Set("status", SecurityStatusToValue(result, status));
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value ContextFlagsToValue(DWORD flags) {
+base::Value::Dict ContextFlagsToValue(DWORD flags) {
   base::Value::Dict params;
   params.Set("value", base::StringPrintf("0x%08lx", flags));
   params.Set("delegated", (flags & ISC_RET_DELEGATE) == ISC_RET_DELEGATE);
   params.Set("mutual", (flags & ISC_RET_MUTUAL_AUTH) == ISC_RET_MUTUAL_AUTH);
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value ContextAttributesToValue(SSPILibrary* library,
-                                     PCtxtHandle handle,
-                                     DWORD attributes) {
+base::Value::Dict ContextAttributesToValue(SSPILibrary* library,
+                                           PCtxtHandle handle,
+                                           DWORD attributes) {
   base::Value::Dict params;
 
   SecPkgContext_NativeNames native_names = {0};
@@ -89,21 +90,21 @@
   }
 
   params.Set("flags", ContextFlagsToValue(attributes));
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value InitializeSecurityContextParams(SSPILibrary* library,
-                                            PCtxtHandle handle,
-                                            Error result,
-                                            SECURITY_STATUS status,
-                                            DWORD attributes) {
+base::Value::Dict InitializeSecurityContextParams(SSPILibrary* library,
+                                                  PCtxtHandle handle,
+                                                  Error result,
+                                                  SECURITY_STATUS status,
+                                                  DWORD attributes) {
   base::Value::Dict params;
   params.Set("status", SecurityStatusToValue(result, status));
   if (result == OK) {
     params.Set("context",
                ContextAttributesToValue(library, handle, attributes));
   }
-  return base::Value(std::move(params));
+  return params;
 }
 
 Error MapAcquireCredentialsStatusToError(SECURITY_STATUS status) {
@@ -549,7 +550,7 @@
     base::Value::Dict params;
     params.Set("spn", spn);
     params.Set("flags", ContextFlagsToValue(context_flags));
-    return base::Value(std::move(params));
+    return params;
   });
 
   // This returns a token that is passed to the remote server.
diff --git a/net/http/http_cache_lookup_manager.cc b/net/http/http_cache_lookup_manager.cc
index d1a469a..cfbec61 100644
--- a/net/http/http_cache_lookup_manager.cc
+++ b/net/http/http_cache_lookup_manager.cc
@@ -16,13 +16,13 @@
 
 // Returns parameters associated with the start of a server push lookup
 // transaction.
-base::Value NetLogPushLookupTransactionParams(
+base::Value::Dict NetLogPushLookupTransactionParams(
     const NetLogSource& net_log,
     const ServerPushDelegate::ServerPushHelper* push_helper) {
   base::Value::Dict dict;
   net_log.AddToEventParameters(dict);
   dict.Set("push_url", push_helper->GetURL().possibly_invalid_spec());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 HttpCacheLookupManager::LookupTransaction::LookupTransaction(
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index b1b4f61..2e0e5f7 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -1241,7 +1241,7 @@
     } else {
       params.Set("net_error", result);
     }
-    return base::Value(std::move(params));
+    return params;
   });
 
   cache_pending_ = false;
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index c7c9d67..f27c952 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -190,10 +190,8 @@
 // Takes in a Value created from a NetLogHttpResponseParameter, and returns
 // a JSONified list of headers as a single string.  Uses single quotes instead
 // of double quotes for easier comparison.
-std::string GetHeaders(const base::Value& params) {
-  if (!params.is_dict())
-    return "";
-  const base::Value::List* header_list = params.GetDict().FindList("headers");
+std::string GetHeaders(const base::Value::Dict& params) {
+  const base::Value::List* header_list = params.FindList("headers");
   if (!header_list)
     return "";
   std::string headers;
diff --git a/net/http/http_request_headers.cc b/net/http/http_request_headers.cc
index f0e27d3..c13525e4 100644
--- a/net/http/http_request_headers.cc
+++ b/net/http/http_request_headers.cc
@@ -223,7 +223,7 @@
   return output;
 }
 
-base::Value HttpRequestHeaders::NetLogParams(
+base::Value::Dict HttpRequestHeaders::NetLogParams(
     const std::string& request_line,
     NetLogCaptureMode capture_mode) const {
   base::Value::Dict dict;
@@ -236,7 +236,7 @@
         NetLogStringValue(base::StrCat({header.key, ": ", log_value})));
   }
   dict.Set("headers", std::move(headers));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void HttpRequestHeaders::SetAcceptEncodingIfMissing(
diff --git a/net/http/http_request_headers.h b/net/http/http_request_headers.h
index 7b6a2c5..0fee96c 100644
--- a/net/http/http_request_headers.h
+++ b/net/http/http_request_headers.h
@@ -16,16 +16,13 @@
 
 #include "base/containers/flat_set.h"
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "net/base/net_export.h"
 #include "net/filter/source_stream.h"
 #include "net/log/net_log_capture_mode.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class NET_EXPORT HttpRequestHeaders {
@@ -192,8 +189,8 @@
 
   // Takes in the request line and returns a Value for use with the NetLog
   // containing both the request line and all headers fields.
-  base::Value NetLogParams(const std::string& request_line,
-                           NetLogCaptureMode capture_mode) const;
+  base::Value::Dict NetLogParams(const std::string& request_line,
+                                 NetLogCaptureMode capture_mode) const;
 
   const HeaderVector& GetHeaderVector() const { return headers_; }
 
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index f8b6dc3..978703d6 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -1369,7 +1369,7 @@
       instance_length);
 }
 
-base::Value HttpResponseHeaders::NetLogParams(
+base::Value::Dict HttpResponseHeaders::NetLogParams(
     NetLogCaptureMode capture_mode) const {
   base::Value::Dict dict;
   base::Value::List headers;
@@ -1383,7 +1383,7 @@
     headers.Append(NetLogStringValue(base::StrCat({name, ": ", log_value})));
   }
   dict.Set("headers", std::move(headers));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 bool HttpResponseHeaders::IsChunkEncoded() const {
diff --git a/net/http/http_response_headers.h b/net/http/http_response_headers.h
index 8741679c..a7172eb 100644
--- a/net/http/http_response_headers.h
+++ b/net/http/http_response_headers.h
@@ -16,6 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "net/base/net_export.h"
 #include "net/http/http_version.h"
 #include "net/log/net_log_capture_mode.h"
@@ -26,7 +27,6 @@
 class PickleIterator;
 class Time;
 class TimeDelta;
-class Value;
 }
 
 namespace net {
@@ -324,7 +324,7 @@
   bool IsChunkEncoded() const;
 
   // Creates a Value for use with the NetLog containing the response headers.
-  base::Value NetLogParams(NetLogCaptureMode capture_mode) const;
+  base::Value::Dict NetLogParams(NetLogCaptureMode capture_mode) const;
 
   // Returns the HTTP response code.  This is 0 if the response code text seems
   // to exist but could not be parsed.  Otherwise, it defaults to 200 if the
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
index 478df65..9240bb09 100644
--- a/net/http/http_server_properties_manager.cc
+++ b/net/http/http_server_properties_manager.cc
@@ -230,9 +230,8 @@
   const base::Value::Dict& http_server_properties_dict =
       pref_delegate_->GetServerProperties();
 
-  net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_CACHE, [&] {
-    return base::Value(http_server_properties_dict.Clone());
-  });
+  net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_CACHE,
+                    [&] { return http_server_properties_dict.Clone(); });
   absl::optional<int> maybe_version_number =
       http_server_properties_dict.FindInt(kVersionKey);
   if (!maybe_version_number.has_value() ||
@@ -765,9 +764,8 @@
       broken_alternative_service_list, kMaxBrokenAlternativeServicesToPersist,
       recently_broken_alternative_services, http_server_properties_dict);
 
-  net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS, [&] {
-    return base::Value(std::move(http_server_properties_dict));
-  });
+  net_log_.AddEvent(NetLogEventType::HTTP_SERVER_PROPERTIES_UPDATE_PREFS,
+                    [&] { return std::move(http_server_properties_dict); });
 
   pref_delegate_->SetServerProperties(std::move(http_server_properties_dict),
                                       std::move(callback));
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index 6b8aac46..facbe4f3 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -88,13 +88,13 @@
 }
 
 // Returns parameters associated with the start of a HTTP stream job.
-base::Value NetLogHttpStreamJobParams(const NetLogSource& source,
-                                      const GURL& original_url,
-                                      const GURL& url,
-                                      bool expect_spdy,
-                                      bool using_quic,
-                                      HttpStreamFactory::JobType job_type,
-                                      RequestPriority priority) {
+base::Value::Dict NetLogHttpStreamJobParams(const NetLogSource& source,
+                                            const GURL& original_url,
+                                            const GURL& url,
+                                            bool expect_spdy,
+                                            bool using_quic,
+                                            HttpStreamFactory::JobType job_type,
+                                            RequestPriority priority) {
   base::Value::Dict dict;
   if (source.IsValid())
     source.AddToEventParameters(dict);
@@ -104,15 +104,15 @@
   dict.Set("using_quic", using_quic);
   dict.Set("priority", RequestPriorityToString(priority));
   dict.Set("type", NetLogHttpStreamJobType(job_type));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Returns parameters associated with the ALPN protocol of a HTTP stream.
-base::Value NetLogHttpStreamProtoParams(NextProto negotiated_protocol) {
+base::Value::Dict NetLogHttpStreamProtoParams(NextProto negotiated_protocol) {
   base::Value::Dict dict;
 
   dict.Set("proto", NextProtoToString(negotiated_protocol));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 HttpStreamFactory::Job::Job(Delegate* delegate,
diff --git a/net/http/http_stream_factory_job_controller.cc b/net/http/http_stream_factory_job_controller.cc
index a0619e12..9a8807d 100644
--- a/net/http/http_stream_factory_job_controller.cc
+++ b/net/http/http_stream_factory_job_controller.cc
@@ -44,14 +44,14 @@
 namespace {
 
 // Returns parameters associated with the proxy resolution.
-base::Value NetLogHttpStreamJobProxyServerResolved(
+base::Value::Dict NetLogHttpStreamJobProxyServerResolved(
     const ProxyServer& proxy_server) {
   base::Value::Dict dict;
 
   dict.Set("proxy_server", proxy_server.is_valid()
                                ? ProxyServerToPacResultElement(proxy_server)
                                : std::string());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 GURL CreateAltSvcUrl(const GURL& origin_url,
@@ -108,22 +108,22 @@
 // the main job.
 const int kMaxDelayTimeForMainJobSecs = 3;
 
-base::Value NetLogJobControllerParams(const HttpRequestInfo& request_info,
-                                      bool is_preconnect) {
+base::Value::Dict NetLogJobControllerParams(const HttpRequestInfo& request_info,
+                                            bool is_preconnect) {
   base::Value::Dict dict;
   dict.Set("url", request_info.url.possibly_invalid_spec());
   dict.Set("is_preconnect", is_preconnect);
   dict.Set("privacy_mode", PrivacyModeToDebugString(request_info.privacy_mode));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogAltSvcParams(const AlternativeServiceInfo* alt_svc_info,
-                               bool is_broken) {
+base::Value::Dict NetLogAltSvcParams(const AlternativeServiceInfo* alt_svc_info,
+                                     bool is_broken) {
   base::Value::Dict dict;
   dict.Set("alt_svc", alt_svc_info->ToString());
   dict.Set("is_broken", is_broken);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 HttpStreamFactory::JobController::JobController(
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index 3de540bb..f352ee4 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -54,14 +54,14 @@
   return cr_separated_headers;
 }
 
-base::Value NetLogSendRequestBodyParams(uint64_t length,
-                                        bool is_chunked,
-                                        bool did_merge) {
+base::Value::Dict NetLogSendRequestBodyParams(uint64_t length,
+                                              bool is_chunked,
+                                              bool did_merge) {
   base::Value::Dict dict;
   dict.Set("length", static_cast<int>(length));
   dict.Set("is_chunked", is_chunked);
   dict.Set("did_merge", did_merge);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void NetLogSendRequestBody(const NetLogWithSource& net_log,
diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc
index 5f88b75..84d67ed 100644
--- a/net/http/transport_security_state.cc
+++ b/net/http/transport_security_state.cc
@@ -399,7 +399,7 @@
   return GetSTSState(host, &unused_sts) || GetPKPState(host, &unused_pkp);
 }
 
-base::Value TransportSecurityState::NetLogUpgradeToSSLParam(
+base::Value::Dict TransportSecurityState::NetLogUpgradeToSSLParam(
     const std::string& host) {
   STSState sts_state;
   base::Value::Dict dict;
@@ -408,7 +408,7 @@
   dict.Set("should_upgrade_to_ssl", sts_state.ShouldUpgradeToSSL());
   dict.Set("host_found_in_hsts_bypass_list",
            hsts_host_bypass_list_.find(host) != hsts_host_bypass_list_.end());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 bool TransportSecurityState::ShouldUpgradeToSSL(
diff --git a/net/http/transport_security_state.h b/net/http/transport_security_state.h
index 2f8c0b5..b5b8d80 100644
--- a/net/http/transport_security_state.h
+++ b/net/http/transport_security_state.h
@@ -19,6 +19,7 @@
 #include "base/strings/string_piece.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "crypto/sha2.h"
 #include "net/base/expiring_cache.h"
 #include "net/base/hash_value.h"
@@ -516,7 +517,7 @@
   typedef ExpiringCache<std::string, bool, base::TimeTicks, std::less<>>
       ReportCache;
 
-  base::Value NetLogUpgradeToSSLParam(const std::string& host);
+  base::Value::Dict NetLogUpgradeToSSLParam(const std::string& host);
 
   // IsBuildTimely returns true if the current build is new enough ensure that
   // built in security information (i.e. HSTS preloading and pinning
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc
index d868ae4..45ffa43 100644
--- a/net/log/file_net_log_observer.cc
+++ b/net/log/file_net_log_observer.cc
@@ -213,7 +213,7 @@
 
   // Writes |constants_value| to disk and opens the events array (closed in
   // Stop()).
-  void Initialize(std::unique_ptr<base::Value> constants_value);
+  void Initialize(std::unique_ptr<base::Value::Dict> constants_value);
 
   // Closes the events array opened in Initialize() and writes |polled_data| to
   // disk. If |polled_data| cannot be converted to proper JSON, then it
@@ -268,8 +268,9 @@
   size_t FileNumberToIndex(size_t file_number) const;
 
   // Writes |constants_value| to a file.
-  static void WriteConstantsToFile(std::unique_ptr<base::Value> constants_value,
-                                   base::File* file);
+  static void WriteConstantsToFile(
+      std::unique_ptr<base::Value::Dict> constants_value,
+      base::File* file);
 
   // Writes |polled_data| to a file.
   static void WritePolledDataToFile(std::unique_ptr<base::Value> polled_data,
@@ -335,7 +336,7 @@
     const base::FilePath& log_path,
     uint64_t max_total_size,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   return CreateInternal(log_path, SiblingInprogressDirectory(log_path),
                         absl::nullopt, max_total_size, kDefaultNumFiles,
                         capture_mode, std::move(constants));
@@ -344,7 +345,7 @@
 std::unique_ptr<FileNetLogObserver> FileNetLogObserver::CreateUnbounded(
     const base::FilePath& log_path,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   return CreateInternal(log_path, base::FilePath(), absl::nullopt, kNoLimit,
                         kDefaultNumFiles, capture_mode, std::move(constants));
 }
@@ -355,7 +356,7 @@
     base::File output_file,
     uint64_t max_total_size,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   return CreateInternal(base::FilePath(), inprogress_dir_path,
                         absl::make_optional<base::File>(std::move(output_file)),
                         max_total_size, kDefaultNumFiles, capture_mode,
@@ -366,7 +367,7 @@
 FileNetLogObserver::CreateUnboundedPreExisting(
     base::File output_file,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   return CreateInternal(base::FilePath(), base::FilePath(),
                         absl::make_optional<base::File>(std::move(output_file)),
                         kNoLimit, kDefaultNumFiles, capture_mode,
@@ -411,7 +412,7 @@
 void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
   auto json = std::make_unique<std::string>();
 
-  *json = SerializeNetLogValueToJson(entry.ToValue());
+  *json = SerializeNetLogValueToJson(entry.ToDict());
 
   size_t queue_size = write_queue_->AddEntryToQueue(std::move(json));
 
@@ -432,7 +433,7 @@
     uint64_t max_total_size,
     size_t total_num_event_files,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   return CreateInternal(log_path, SiblingInprogressDirectory(log_path),
                         absl::nullopt, max_total_size, total_num_event_files,
                         capture_mode, std::move(constants));
@@ -445,7 +446,7 @@
     uint64_t max_total_size,
     size_t total_num_event_files,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants) {
+    std::unique_ptr<base::Value::Dict> constants) {
   DCHECK_GT(total_num_event_files, 0u);
 
   scoped_refptr<base::SequencedTaskRunner> file_task_runner =
@@ -485,17 +486,16 @@
     std::unique_ptr<FileWriter> file_writer,
     scoped_refptr<WriteQueue> write_queue,
     NetLogCaptureMode capture_mode,
-    std::unique_ptr<base::Value> constants)
+    std::unique_ptr<base::Value::Dict> constants)
     : file_task_runner_(std::move(file_task_runner)),
       write_queue_(std::move(write_queue)),
       file_writer_(std::move(file_writer)),
       capture_mode_(capture_mode) {
   if (!constants)
-    constants = std::make_unique<base::Value>(GetNetConstants());
+    constants = std::make_unique<base::Value::Dict>(GetNetConstants());
 
-  DCHECK(constants->is_dict());
-  DCHECK(!constants->GetDict().Find("logCaptureMode"));
-  constants->GetDict().Set("logCaptureMode", CaptureModeToString(capture_mode));
+  DCHECK(!constants->Find("logCaptureMode"));
+  constants->Set("logCaptureMode", CaptureModeToString(capture_mode));
   file_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&FileNetLogObserver::FileWriter::Initialize,
                                 base::Unretained(file_writer_.get()),
@@ -568,7 +568,7 @@
 FileNetLogObserver::FileWriter::~FileWriter() = default;
 
 void FileNetLogObserver::FileWriter::Initialize(
-    std::unique_ptr<base::Value> constants_value) {
+    std::unique_ptr<base::Value::Dict> constants_value) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Open the final log file, and keep it open for the duration of logging (even
@@ -710,7 +710,7 @@
 }
 
 void FileNetLogObserver::FileWriter::WriteConstantsToFile(
-    std::unique_ptr<base::Value> constants_value,
+    std::unique_ptr<base::Value::Dict> constants_value,
     base::File* file) {
   // Print constants to file and open events array.
   std::string json = SerializeNetLogValueToJson(*constants_value);
@@ -829,7 +829,7 @@
       "stitch_net_log_files.py\n");
 }
 
-std::string SerializeNetLogValueToJson(const base::Value& value) {
+std::string SerializeNetLogValueToJson(const base::ValueView& value) {
   // Omit trailing ".0" when printing a DOUBLE that is representable as a 64-bit
   // integer. This makes the values returned by NetLogNumberValue() look more
   // pleasant (for representing integers between 32 and 53 bits large).
diff --git a/net/log/file_net_log_observer.h b/net/log/file_net_log_observer.h
index b8934ae..cba2390 100644
--- a/net/log/file_net_log_observer.h
+++ b/net/log/file_net_log_observer.h
@@ -11,12 +11,12 @@
 #include "base/files/file.h"
 #include "base/functional/callback.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/values.h"
 #include "net/base/net_export.h"
 #include "net/log/net_log.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace base {
-class Value;
 class FilePath;
 class SequencedTaskRunner;
 }  // namespace base
@@ -51,20 +51,22 @@
   // (slightly) exceed it. This may be set to kNoLimit to remove any size
   // restrictions.
   //
-  // |constants| is an optional legend for decoding constant values used in
-  // the log. It should generally be a modified version of GetNetConstants().
-  // If not present, the output of GetNetConstants() will be used.
+  // |constants| is an optional legend for decoding constant values used in the
+  // log. It should generally be a modified version of GetNetConstants(). If not
+  // present, the output of GetNetConstants() will be used.
+  // TODO(https://crbug.com/1418110): This should be updated to pass a
+  // base::Value::Dict instead of a std::unique_ptr.
   static std::unique_ptr<FileNetLogObserver> CreateBounded(
       const base::FilePath& log_path,
       uint64_t max_total_size,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
   // Shortcut for calling CreateBounded() with kNoLimit.
   static std::unique_ptr<FileNetLogObserver> CreateUnbounded(
       const base::FilePath& log_path,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
   // Creates a bounded log that writes to a pre-existing file (truncating
   // it to start with, and closing it upon completion).  |inprogress_dir_path|
@@ -75,14 +77,14 @@
       base::File output_file,
       uint64_t max_total_size,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
   // Creates an unbounded log that writes to a pre-existing file (truncating
   // it to start with, and closing it upon completion).
   static std::unique_ptr<FileNetLogObserver> CreateUnboundedPreExisting(
       base::File output_file,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
   FileNetLogObserver(const FileNetLogObserver&) = delete;
   FileNetLogObserver& operator=(const FileNetLogObserver&) = delete;
@@ -119,7 +121,7 @@
       uint64_t max_total_size,
       size_t total_num_event_files,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
  private:
   class WriteQueue;
@@ -132,13 +134,13 @@
       uint64_t max_total_size,
       size_t total_num_event_files,
       NetLogCaptureMode capture_mode,
-      std::unique_ptr<base::Value> constants);
+      std::unique_ptr<base::Value::Dict> constants);
 
   FileNetLogObserver(scoped_refptr<base::SequencedTaskRunner> file_task_runner,
                      std::unique_ptr<FileWriter> file_writer,
                      scoped_refptr<WriteQueue> write_queue,
                      NetLogCaptureMode capture_mode,
-                     std::unique_ptr<base::Value> constants);
+                     std::unique_ptr<base::Value::Dict> constants);
 
   static std::string CaptureModeToString(NetLogCaptureMode mode);
 
@@ -163,7 +165,7 @@
 
 // Serializes |value| to a JSON string used when writing to a file.
 NET_EXPORT_PRIVATE std::string SerializeNetLogValueToJson(
-    const base::Value& value);
+    const base::ValueView& value);
 
 }  // namespace net
 
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc
index 1868855..adcebec 100644
--- a/net/log/file_net_log_observer_unittest.cc
+++ b/net/log/file_net_log_observer_unittest.cc
@@ -63,7 +63,7 @@
   NetLogEntry base_entry(NetLogEventType::PAC_JAVASCRIPT_ERROR, source,
                          NetLogEventPhase::BEGIN, base::TimeTicks::Now(),
                          NetLogParamsWithString("message", ""));
-  base::Value value = base_entry.ToValue();
+  base::Value::Dict value = base_entry.ToDict();
   std::string json;
   base::JSONWriter::Write(value, &json);
   size_t base_entry_size = json.size();
@@ -229,7 +229,7 @@
   bool IsBounded() const { return GetParam(); }
 
   void CreateAndStartObserving(
-      std::unique_ptr<base::Value> constants,
+      std::unique_ptr<base::Value::Dict> constants,
       NetLogCaptureMode capture_mode = NetLogCaptureMode::kDefault) {
     if (IsBounded()) {
       logger_ = FileNetLogObserver::CreateBoundedForTests(
@@ -244,7 +244,7 @@
   }
 
   void CreateAndStartObservingPreExisting(
-      std::unique_ptr<base::Value> constants) {
+      std::unique_ptr<base::Value::Dict> constants) {
     ASSERT_TRUE(scratch_dir_.CreateUniqueTempDir());
 
     base::File file(log_path_,
@@ -295,7 +295,7 @@
     RunUntilIdle();
   }
 
-  void CreateAndStartObserving(std::unique_ptr<base::Value> constants,
+  void CreateAndStartObserving(std::unique_ptr<base::Value::Dict> constants,
                                uint64_t total_file_size,
                                int num_files) {
     logger_ = FileNetLogObserver::CreateBoundedForTests(
@@ -504,7 +504,8 @@
   base::Value::Dict constants;
   constants.SetByDottedPath(kConstantKey, kConstantString);
 
-  CreateAndStartObserving(std::make_unique<base::Value>(std::move(constants)));
+  CreateAndStartObserving(
+      std::make_unique<base::Value::Dict>(std::move(constants)));
 
   logger_->StopObserving(nullptr, closure.closure());
 
@@ -900,7 +901,7 @@
 
   // By creating a file where a directory should be, it will not be possible to
   // write any event files.
-  EXPECT_TRUE(base::WriteFile(GetInprogressDirectory(), "x", 1));
+  EXPECT_TRUE(base::WriteFile(GetInprogressDirectory(), "x"));
 
   CreateAndStartObserving(nullptr, kTotalFileSize, kTotalNumFiles);
 
diff --git a/net/log/net_log.cc b/net/log/net_log.cc
index 53177340..6438a74 100644
--- a/net/log/net_log.cc
+++ b/net/log/net_log.cc
@@ -49,7 +49,7 @@
                                          const NetLogSource& source,
                                          NetLogEventPhase phase,
                                          base::TimeTicks time,
-                                         base::Value&& params) {
+                                         base::Value::Dict params) {
   DCHECK(net_log_);
   net_log_->AddEntryAtTimeWithMaterializedParams(type, source, phase, time,
                                                  std::move(params));
@@ -67,7 +67,7 @@
 void NetLog::AddEntry(NetLogEventType type,
                       const NetLogSource& source,
                       NetLogEventPhase phase) {
-  AddEntry(type, source, phase, [] { return base::Value(); });
+  AddEntry(type, source, phase, [] { return base::Value::Dict(); });
 }
 
 void NetLog::AddGlobalEntry(NetLogEventType type) {
@@ -258,7 +258,7 @@
 void NetLog::AddEntryWithMaterializedParams(NetLogEventType type,
                                             const NetLogSource& source,
                                             NetLogEventPhase phase,
-                                            base::Value&& params) {
+                                            base::Value::Dict params) {
   AddEntryAtTimeWithMaterializedParams(
       type, source, phase, base::TimeTicks::Now(), std::move(params));
 }
@@ -267,7 +267,7 @@
                                                   const NetLogSource& source,
                                                   NetLogEventPhase phase,
                                                   base::TimeTicks time,
-                                                  base::Value&& params) {
+                                                  base::Value::Dict params) {
   NetLogEntry entry(type, source, phase, time, std::move(params));
 
   // Notify all of the log observers, regardless of capture mode.
diff --git a/net/log/net_log.h b/net/log/net_log.h
index 75e44cf..21f8738 100644
--- a/net/log/net_log.h
+++ b/net/log/net_log.h
@@ -17,6 +17,7 @@
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
 #include "base/types/pass_key.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "net/base/net_export.h"
 #include "net/log/net_log_capture_mode.h"
@@ -25,10 +26,6 @@
 #include "net/log/net_log_source.h"
 #include "net/log/net_log_source_type.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class NetLogWithSource;
@@ -166,7 +163,7 @@
                                               const NetLogSource& source,
                                               NetLogEventPhase phase,
                                               base::TimeTicks time,
-                                              base::Value&& params);
+                                              base::Value::Dict params);
 
    private:
     // Friend NetLog so that AddCaptureModeObserver/RemoveCaptureModeObserver
@@ -255,7 +252,7 @@
      public:
       explicit GetParamsImpl(const ParametersCallback& get_params)
           : get_params_(get_params) {}
-      base::Value GetParams(NetLogCaptureMode mode) const override {
+      base::Value::Dict GetParams(NetLogCaptureMode mode) const override {
         return (*get_params_)(mode);
       }
 
@@ -352,7 +349,7 @@
  private:
   class GetParamsInterface {
    public:
-    virtual base::Value GetParams(NetLogCaptureMode mode) const = 0;
+    virtual base::Value::Dict GetParams(NetLogCaptureMode mode) const = 0;
     virtual ~GetParamsInterface() = default;
   };
 
@@ -377,7 +374,7 @@
   void AddEntryWithMaterializedParams(NetLogEventType type,
                                       const NetLogSource& source,
                                       NetLogEventPhase phase,
-                                      base::Value&& params);
+                                      base::Value::Dict params);
 
   // Adds an entry at a certain time, using already materialized parameters,
   // when it is already known that the log is capturing (goes straight to
@@ -386,7 +383,7 @@
                                             const NetLogSource& source,
                                             NetLogEventPhase phase,
                                             base::TimeTicks time,
-                                            base::Value&& params);
+                                            base::Value::Dict params);
 
   // Called whenever an observer is added or removed, to update
   // |observer_capture_modes_|. Must have acquired |lock_| prior to calling.
diff --git a/net/log/net_log_entry.cc b/net/log/net_log_entry.cc
index 2045440..e25951e 100644
--- a/net/log/net_log_entry.cc
+++ b/net/log/net_log_entry.cc
@@ -19,7 +19,7 @@
                          NetLogSource source,
                          NetLogEventPhase phase,
                          base::TimeTicks time,
-                         base::Value params)
+                         base::Value::Dict params)
     : type(type),
       source(source),
       phase(phase),
@@ -31,7 +31,7 @@
 NetLogEntry::NetLogEntry(NetLogEntry&& entry) = default;
 NetLogEntry& NetLogEntry::operator=(NetLogEntry&& entry) = default;
 
-base::Value NetLogEntry::ToValue() const {
+base::Value::Dict NetLogEntry::ToDict() const {
   base::Value::Dict entry_dict;
 
   entry_dict.Set("time", NetLog::TickCountToString(time));
@@ -48,10 +48,11 @@
   entry_dict.Set("phase", static_cast<int>(phase));
 
   // Set the event-specific parameters.
-  if (!params.is_none())
+  if (!params.empty()) {
     entry_dict.Set("params", params.Clone());
+  }
 
-  return base::Value(std::move(entry_dict));
+  return entry_dict;
 }
 
 NetLogEntry NetLogEntry::Clone() const {
@@ -59,7 +60,7 @@
 }
 
 bool NetLogEntry::HasParams() const {
-  return !params.is_none();
+  return !params.empty();
 }
 
 }  // namespace net
diff --git a/net/log/net_log_entry.h b/net/log/net_log_entry.h
index 4e213da9..d3a38dd 100644
--- a/net/log/net_log_entry.h
+++ b/net/log/net_log_entry.h
@@ -21,7 +21,7 @@
               NetLogSource source,
               NetLogEventPhase phase,
               base::TimeTicks time,
-              base::Value params);
+              base::Value::Dict params);
 
   ~NetLogEntry();
 
@@ -29,8 +29,8 @@
   NetLogEntry(NetLogEntry&& entry);
   NetLogEntry& operator=(NetLogEntry&& entry);
 
-  // Serializes the specified event to a Value.
-  base::Value ToValue() const;
+  // Serializes the specified event to a Dict.
+  base::Value::Dict ToDict() const;
 
   // NetLogEntry is not copy constructible, however copying is useful for
   // unittests.
@@ -43,7 +43,7 @@
   NetLogSource source;
   NetLogEventPhase phase;
   base::TimeTicks time;
-  base::Value params;
+  base::Value::Dict params;
 };
 
 }  // namespace net
diff --git a/net/log/net_log_source.cc b/net/log/net_log_source.cc
index 9342ae6..a6544eac 100644
--- a/net/log/net_log_source.cc
+++ b/net/log/net_log_source.cc
@@ -40,12 +40,12 @@
   event_params.Set("source_dependency", std::move(dict));
 }
 
-base::Value NetLogSource::ToEventParameters() const {
+base::Value::Dict NetLogSource::ToEventParameters() const {
   if (!IsValid())
-    return base::Value();
+    return base::Value::Dict();
   base::Value::Dict event_params;
   AddToEventParameters(event_params);
-  return base::Value(std::move(event_params));
+  return event_params;
 }
 
 }  // namespace net
diff --git a/net/log/net_log_source.h b/net/log/net_log_source.h
index 50b502f..bbf7bceb 100644
--- a/net/log/net_log_source.h
+++ b/net/log/net_log_source.h
@@ -34,7 +34,7 @@
 
   // Returns a dictionary with a single entry named "source_dependency" that
   // describes |this|.
-  base::Value ToEventParameters() const;
+  base::Value::Dict ToEventParameters() const;
 
   NetLogSourceType type;
   uint32_t id;
diff --git a/net/log/net_log_unittest.cc b/net/log/net_log_unittest.cc
index b5f4278..0b6f648 100644
--- a/net/log/net_log_unittest.cc
+++ b/net/log/net_log_unittest.cc
@@ -31,10 +31,10 @@
   return base::Value(CaptureModeToInt(capture_mode));
 }
 
-base::Value NetCaptureModeParams(NetLogCaptureMode capture_mode) {
+base::Value::Dict NetCaptureModeParams(NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("capture_mode", CaptureModeToValue(capture_mode));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 TEST(NetLogTest, BasicGlobalEvents) {
@@ -211,23 +211,27 @@
   }
 
   void OnAddEntry(const NetLogEntry& entry) override {
-    std::unique_ptr<base::Value> dict =
-        base::Value::ToUniquePtrValue(entry.ToValue());
+    // TODO(https://crbug.com/1418110): This should be updated to be a
+    // base::Value::Dict instead of a std::unique_ptr.
+    std::unique_ptr<base::Value::Dict> dict =
+        std::make_unique<base::Value::Dict>(entry.ToDict());
     ASSERT_TRUE(dict);
     values_.push_back(std::move(dict));
   }
 
   size_t GetNumValues() const { return values_.size(); }
-  base::Value* GetValue(size_t index) const { return values_[index].get(); }
+  base::Value::Dict* GetDict(size_t index) const {
+    return values_[index].get();
+  }
 
  private:
-  std::vector<std::unique_ptr<base::Value>> values_;
+  std::vector<std::unique_ptr<base::Value::Dict>> values_;
 };
 
 void AddEvent(NetLog* net_log) {
   net_log->AddGlobalEntry(NetLogEventType::CANCELLED,
                           [&](NetLogCaptureMode capture_mode) {
-                            return CaptureModeToValue(capture_mode);
+                            return NetCaptureModeParams(capture_mode);
                           });
 }
 
@@ -415,11 +419,11 @@
   absl::optional<int> param;
   AddEvent(NetLog::Get());
   ASSERT_EQ(1U, observer[0].GetNumValues());
-  param = observer[0].GetValue(0)->GetDict().FindInt("params");
+  param = observer[0].GetDict(0)->FindDict("params")->FindInt("capture_mode");
   ASSERT_TRUE(param);
   EXPECT_EQ(CaptureModeToInt(observer[0].capture_mode()), param.value());
   ASSERT_EQ(1U, observer[1].GetNumValues());
-  param = observer[1].GetValue(0)->GetDict().FindInt("params");
+  param = observer[1].GetDict(0)->FindDict("params")->FindInt("capture_mode");
   ASSERT_TRUE(param);
   EXPECT_EQ(CaptureModeToInt(observer[1].capture_mode()), param.value());
 
@@ -460,10 +464,11 @@
 TEST(NetLogTest, NetLogEntryToValueEmptyParams) {
   // NetLogEntry with no params.
   NetLogEntry entry1(NetLogEventType::REQUEST_ALIVE, NetLogSource(),
-                     NetLogEventPhase::BEGIN, base::TimeTicks(), base::Value());
+                     NetLogEventPhase::BEGIN, base::TimeTicks(),
+                     base::Value::Dict());
 
-  ASSERT_TRUE(entry1.params.is_none());
-  ASSERT_FALSE(entry1.ToValue().GetDict().Find("params"));
+  ASSERT_TRUE(entry1.params.empty());
+  ASSERT_FALSE(entry1.ToDict().Find("params"));
 }
 
 }  // namespace
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc
index b9c621b..5755e77 100644
--- a/net/log/net_log_util.cc
+++ b/net/log/net_log_util.cc
@@ -340,7 +340,7 @@
     HostCache* cache = host_resolver->GetHostCache();
     if (cache) {
       base::Value::Dict dict;
-      base::Value dns_config = host_resolver->GetDnsConfigAsValue();
+      base::Value::Dict dns_config = host_resolver->GetDnsConfigAsValue();
       dict.Set("dns_config", std::move(dns_config));
 
       base::Value::Dict cache_info_dict;
diff --git a/net/log/net_log_values.cc b/net/log/net_log_values.cc
index 3c2f0f9..b79ea7f 100644
--- a/net/log/net_log_values.cc
+++ b/net/log/net_log_values.cc
@@ -80,29 +80,29 @@
   return NetLogNumberValueHelper(num);
 }
 
-base::Value NetLogParamsWithInt(base::StringPiece name, int value) {
+base::Value::Dict NetLogParamsWithInt(base::StringPiece name, int value) {
   base::Value::Dict params;
   params.Set(name, value);
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value NetLogParamsWithInt64(base::StringPiece name, int64_t value) {
+base::Value::Dict NetLogParamsWithInt64(base::StringPiece name, int64_t value) {
   base::Value::Dict params;
   params.Set(name, NetLogNumberValue(value));
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value NetLogParamsWithBool(base::StringPiece name, bool value) {
+base::Value::Dict NetLogParamsWithBool(base::StringPiece name, bool value) {
   base::Value::Dict params;
   params.Set(name, value);
-  return base::Value(std::move(params));
+  return params;
 }
 
-base::Value NetLogParamsWithString(base::StringPiece name,
-                                   base::StringPiece value) {
+base::Value::Dict NetLogParamsWithString(base::StringPiece name,
+                                         base::StringPiece value) {
   base::Value::Dict params;
   params.Set(name, value);
-  return base::Value(std::move(params));
+  return params;
 }
 
 }  // namespace net
diff --git a/net/log/net_log_values.h b/net/log/net_log_values.h
index bae04e6..71eb4c5 100644
--- a/net/log/net_log_values.h
+++ b/net/log/net_log_values.h
@@ -10,22 +10,21 @@
 
 #include "base/containers/span.h"
 #include "base/strings/string_piece_forward.h"
+#include "base/values.h"
 #include "net/base/net_export.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 // Helpers to construct dictionaries with a single key and value. Useful for
 // building parameters to include in a NetLog.
-NET_EXPORT base::Value NetLogParamsWithInt(base::StringPiece name, int value);
-NET_EXPORT base::Value NetLogParamsWithInt64(base::StringPiece name,
-                                             int64_t value);
-NET_EXPORT base::Value NetLogParamsWithBool(base::StringPiece name, bool value);
-NET_EXPORT base::Value NetLogParamsWithString(base::StringPiece name,
-                                              base::StringPiece value);
+NET_EXPORT base::Value::Dict NetLogParamsWithInt(base::StringPiece name,
+                                                 int value);
+NET_EXPORT base::Value::Dict NetLogParamsWithInt64(base::StringPiece name,
+                                                   int64_t value);
+NET_EXPORT base::Value::Dict NetLogParamsWithBool(base::StringPiece name,
+                                                  bool value);
+NET_EXPORT base::Value::Dict NetLogParamsWithString(base::StringPiece name,
+                                                    base::StringPiece value);
 
 // Creates a base::Value() to represent the byte string |raw| when adding it to
 // the NetLog.
diff --git a/net/log/net_log_with_source.cc b/net/log/net_log_with_source.cc
index b4af2e4..72077581 100644
--- a/net/log/net_log_with_source.cc
+++ b/net/log/net_log_with_source.cc
@@ -22,14 +22,14 @@
 // Returns parameters for logging data transferred events. At a minimum includes
 // the number of bytes transferred. If the capture mode allows logging byte
 // contents and |byte_count| > 0, then will include the actual bytes.
-base::Value BytesTransferredParams(int byte_count,
-                                   const char* bytes,
-                                   NetLogCaptureMode capture_mode) {
+base::Value::Dict BytesTransferredParams(int byte_count,
+                                         const char* bytes,
+                                         NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("byte_count", byte_count);
   if (NetLogCaptureIncludesSocketBytes(capture_mode) && byte_count > 0)
     dict.Set("bytes", NetLogBinaryValue(bytes, byte_count));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/log/test_net_log.cc b/net/log/test_net_log.cc
index cf7739c..0a4d666b 100644
--- a/net/log/test_net_log.cc
+++ b/net/log/test_net_log.cc
@@ -85,7 +85,7 @@
 }
 
 void RecordingNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
-  base::Value params = entry.params.Clone();
+  base::Value::Dict params = entry.params.Clone();
   base::RepeatingClosure add_entry_callback;
   {
     // Only need to acquire the lock when accessing class variables.
diff --git a/net/log/test_net_log_util.cc b/net/log/test_net_log_util.cc
index 9c62fc7..258d4d15 100644
--- a/net/log/test_net_log_util.cc
+++ b/net/log/test_net_log_util.cc
@@ -126,11 +126,11 @@
 absl::optional<std::string> GetOptionalStringValueFromParams(
     const NetLogEntry& entry,
     base::StringPiece path) {
-  if (!entry.params.is_dict())
+  if (entry.params.empty()) {
     return absl::nullopt;
+  }
 
-  const std::string* result =
-      entry.params.GetDict().FindStringByDottedPath(path);
+  const std::string* result = entry.params.FindStringByDottedPath(path);
   if (!result)
     return absl::nullopt;
 
@@ -139,16 +139,18 @@
 
 absl::optional<bool> GetOptionalBooleanValueFromParams(const NetLogEntry& entry,
                                                        base::StringPiece path) {
-  if (!entry.params.is_dict())
+  if (entry.params.empty()) {
     return absl::nullopt;
-  return entry.params.GetDict().FindBoolByDottedPath(path);
+  }
+  return entry.params.FindBoolByDottedPath(path);
 }
 
 absl::optional<int> GetOptionalIntegerValueFromParams(const NetLogEntry& entry,
                                                       base::StringPiece path) {
-  if (!entry.params.is_dict())
+  if (entry.params.empty()) {
     return absl::nullopt;
-  return entry.params.GetDict().FindIntByDottedPath(path);
+  }
+  return entry.params.FindIntByDottedPath(path);
 }
 
 absl::optional<int> GetOptionalNetErrorCodeFromParams(
diff --git a/net/log/trace_net_log_observer.cc b/net/log/trace_net_log_observer.cc
index 6ce9282..4f54871 100644
--- a/net/log/trace_net_log_observer.cc
+++ b/net/log/trace_net_log_observer.cc
@@ -26,12 +26,12 @@
 
 class TracedValue : public base::trace_event::ConvertableToTraceFormat {
  public:
-  explicit TracedValue(base::Value value) : value_(std::move(value)) {}
+  explicit TracedValue(base::Value::Dict value) : value_(std::move(value)) {}
   ~TracedValue() override = default;
 
  private:
   void AppendAsTraceFormat(std::string* out) const override {
-    if (!value_.is_none()) {
+    if (!value_.empty()) {
       std::string tmp;
       base::JSONWriter::Write(value_, &tmp);
       *out += tmp;
@@ -41,7 +41,7 @@
   }
 
  private:
-  base::Value value_;
+  base::Value::Dict value_;
 };
 
 }  // namespace
@@ -54,7 +54,7 @@
 }
 
 void TraceNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
-  base::Value params = entry.params.Clone();
+  base::Value::Dict params = entry.params.Clone();
   switch (entry.phase) {
     case NetLogEventPhase::BEGIN:
       TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(
diff --git a/net/nqe/event_creator.cc b/net/nqe/event_creator.cc
index bb0b981..e247579d 100644
--- a/net/nqe/event_creator.cc
+++ b/net/nqe/event_creator.cc
@@ -19,7 +19,7 @@
 
 namespace {
 
-base::Value NetworkQualityChangedNetLogParams(
+base::Value::Dict NetworkQualityChangedNetLogParams(
     base::TimeDelta http_rtt,
     base::TimeDelta transport_rtt,
     int32_t downstream_throughput_kbps,
@@ -31,7 +31,7 @@
   value.Set("downstream_throughput_kbps", downstream_throughput_kbps);
   value.Set("effective_connection_type",
             GetNameForEffectiveConnectionType(effective_connection_type));
-  return base::Value(std::move(value));
+  return value;
 }
 
 bool MetricChangedMeaningfully(int32_t past_value, int32_t current_value) {
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index e8aeed4..013bdb6 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -1467,12 +1467,12 @@
   for (const auto& test : tests) {
     std::map<std::string, std::string> variation_params;
     variation_params["add_default_platform_observations"] = "false";
-    TestNetworkQualityEstimator estimator(variation_params);
 
     base::SimpleTestTickClock tick_clock;
     tick_clock.Advance(base::Seconds(1));
-    estimator.SetTickClockForTesting(&tick_clock);
 
+    TestNetworkQualityEstimator estimator(variation_params);
+    estimator.SetTickClockForTesting(&tick_clock);
     estimator.SetStartTimeNullHttpRtt(test.http_rtt);
     estimator.SetStartTimeNullTransportRtt(test.transport_rtt);
 
@@ -1557,12 +1557,12 @@
     std::map<std::string, std::string> variation_params;
     variation_params["add_default_platform_observations"] = "false";
     variation_params["use_end_to_end_rtt"] = "true";
-    TestNetworkQualityEstimator estimator(variation_params);
 
-    base::SimpleTestTickClock tick_clock;
+    base::SimpleTestTickClock tick_clock;  // Must outlive `estimator`.
     tick_clock.Advance(base::Seconds(1));
-    estimator.SetTickClockForTesting(&tick_clock);
 
+    TestNetworkQualityEstimator estimator(variation_params);
+    estimator.SetTickClockForTesting(&tick_clock);
     estimator.SetStartTimeNullHttpRtt(test.http_rtt);
     estimator.set_start_time_null_end_to_end_rtt(test.end_to_end_rtt);
 
@@ -2894,14 +2894,15 @@
 }
 
 TEST_F(NetworkQualityEstimatorTest, PeerToPeerConnectionCounts) {
-  TestNetworkQualityEstimator estimator;
   base::SimpleTestTickClock tick_clock;
+  TestNetworkQualityEstimator estimator;
   estimator.SetTickClockForTesting(&tick_clock);
-  base::HistogramTester histogram_tester;
-
   estimator.OnPeerToPeerConnectionsCountChange(3u);
+
   base::TimeDelta advance_1 = base::Minutes(4);
   tick_clock.Advance(advance_1);
+
+  base::HistogramTester histogram_tester;
   histogram_tester.ExpectTotalCount("NQE.PeerToPeerConnectionsDuration", 0);
 
   estimator.OnPeerToPeerConnectionsCountChange(1u);
diff --git a/net/proxy_resolution/configured_proxy_resolution_service.cc b/net/proxy_resolution/configured_proxy_resolution_service.cc
index 2a4da7f38..2463ee9c 100644
--- a/net/proxy_resolution/configured_proxy_resolution_service.cc
+++ b/net/proxy_resolution/configured_proxy_resolution_service.cc
@@ -288,7 +288,7 @@
 };
 
 // Returns NetLog parameters describing a proxy configuration change.
-base::Value NetLogProxyConfigChangedParams(
+base::Value::Dict NetLogProxyConfigChangedParams(
     const absl::optional<ProxyConfigWithAnnotation>* old_config,
     const ProxyConfigWithAnnotation* new_config) {
   base::Value::Dict dict;
@@ -297,24 +297,25 @@
   if (old_config->has_value())
     dict.Set("old_config", (*old_config)->value().ToValue());
   dict.Set("new_config", new_config->value().ToValue());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogBadProxyListParams(const ProxyRetryInfoMap* retry_info) {
+base::Value::Dict NetLogBadProxyListParams(
+    const ProxyRetryInfoMap* retry_info) {
   base::Value::Dict dict;
   base::Value::List list;
 
   for (const auto& retry_info_pair : *retry_info)
     list.Append(retry_info_pair.first);
   dict.Set("bad_proxy_list", std::move(list));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Returns NetLog parameters on a successful proxy resolution.
-base::Value NetLogFinishedResolvingProxyParams(const ProxyInfo* result) {
+base::Value::Dict NetLogFinishedResolvingProxyParams(const ProxyInfo* result) {
   base::Value::Dict dict;
   dict.Set("pac_string", result->ToPacString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Returns a sanitized copy of |url| which is safe to pass on to a PAC script.
diff --git a/net/proxy_resolution/pac_file_decider.cc b/net/proxy_resolution/pac_file_decider.cc
index 4deba5e..b880110c4 100644
--- a/net/proxy_resolution/pac_file_decider.cc
+++ b/net/proxy_resolution/pac_file_decider.cc
@@ -66,7 +66,7 @@
 PacFileDataWithSource& PacFileDataWithSource::operator=(
     const PacFileDataWithSource&) = default;
 
-base::Value PacFileDecider::PacSource::NetLogParams(
+base::Value::Dict PacFileDecider::PacSource::NetLogParams(
     const GURL& effective_pac_url) const {
   base::Value::Dict dict;
   std::string source;
@@ -84,7 +84,7 @@
       break;
   }
   dict.Set("source", source);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 PacFileDecider::PacFileDecider(PacFileFetcher* pac_file_fetcher,
diff --git a/net/proxy_resolution/pac_file_decider.h b/net/proxy_resolution/pac_file_decider.h
index f31a1ad..8e08541 100644
--- a/net/proxy_resolution/pac_file_decider.h
+++ b/net/proxy_resolution/pac_file_decider.h
@@ -15,6 +15,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/dns/host_resolver.h"
@@ -23,10 +24,6 @@
 #include "net/proxy_resolution/proxy_resolver.h"
 #include "url/gurl.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class DhcpPacFileFetcher;
@@ -124,7 +121,7 @@
     // Returns a Value representing the PacSource.  |effective_pac_url| is the
     // URL derived from information contained in
     // |this|, if Type is not WPAD_DHCP.
-    base::Value NetLogParams(const GURL& effective_pac_url) const;
+    base::Value::Dict NetLogParams(const GURL& effective_pac_url) const;
 
     Type type;
     GURL url;  // Empty unless |type == PAC_SOURCE_CUSTOM|.
diff --git a/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc b/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
index e0453a3..404a3be3 100644
--- a/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
+++ b/net/proxy_resolution/win/dhcp_pac_file_fetcher_win.cc
@@ -200,7 +200,8 @@
   base::queue<LocationAndTask> pending_tasks_;
 };
 
-base::Value NetLogGetAdaptersDoneParams(DhcpAdapterNamesLoggingInfo* info) {
+base::Value::Dict NetLogGetAdaptersDoneParams(
+    DhcpAdapterNamesLoggingInfo* info) {
   base::Value::Dict result;
 
   // Add information on each of the adapters enumerated (including those that
@@ -240,16 +241,16 @@
   if (info->error != ERROR_SUCCESS)
     result.Set("error", static_cast<int>(info->error));
 
-  return base::Value(std::move(result));
+  return result;
 }
 
-base::Value NetLogFetcherDoneParams(int fetcher_index, int net_error) {
+base::Value::Dict NetLogFetcherDoneParams(int fetcher_index, int net_error) {
   base::Value::Dict result;
 
   result.Set("fetcher_index", fetcher_index);
   result.Set("net_error", net_error);
 
-  return base::Value(std::move(result));
+  return result;
 }
 
 }  // namespace
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc
index 249aee0..d65494d 100644
--- a/net/quic/dedicated_web_transport_http3_client.cc
+++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -109,7 +109,7 @@
           error_dict.Set("details", error->details);
           dict.Set("error", std::move(error_dict));
         }
-        return base::Value(std::move(dict));
+        return dict;
       });
 }
 
@@ -288,7 +288,7 @@
         dict.Set("url", url.possibly_invalid_spec());
         dict.Set("network_anonymization_key",
                  anonymization_key.ToDebugString());
-        return base::Value(std::move(dict));
+        return dict;
       });
 }
 
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 08b0c4cf..b4844da 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -188,23 +188,23 @@
   }
 }
 
-base::Value NetLogQuicMigrationFailureParams(
+base::Value::Dict NetLogQuicMigrationFailureParams(
     quic::QuicConnectionId connection_id,
     base::StringPiece reason) {
   base::Value::Dict dict;
   dict.Set("connection_id", connection_id.ToString());
   dict.Set("reason", reason);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicMigrationSuccessParams(
+base::Value::Dict NetLogQuicMigrationSuccessParams(
     quic::QuicConnectionId connection_id) {
   base::Value::Dict dict;
   dict.Set("connection_id", connection_id.ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogProbingResultParams(
+base::Value::Dict NetLogProbingResultParams(
     handles::NetworkHandle network,
     const quic::QuicSocketAddress* peer_address,
     bool is_success) {
@@ -212,15 +212,15 @@
   dict.Set("network", base::NumberToString(network));
   dict.Set("peer address", peer_address->ToString());
   dict.Set("is_success", is_success);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogAcceptChFrameReceivedParams(
+base::Value::Dict NetLogAcceptChFrameReceivedParams(
     spdy::AcceptChOriginValuePair entry) {
   base::Value::Dict dict;
   dict.Set("origin", entry.origin);
   dict.Set("accept_ch", entry.value);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Histogram for recording the different reasons that a QUIC session is unable
@@ -289,7 +289,7 @@
   return "InvalidCause";
 }
 
-base::Value NetLogQuicClientSessionParams(
+base::Value::Dict NetLogQuicClientSessionParams(
     const QuicSessionKey* session_key,
     const quic::QuicConnectionId& connection_id,
     const quic::QuicConnectionId& client_connection_id,
@@ -310,10 +310,10 @@
     dict.Set("client_connection_id", client_connection_id.ToString());
   }
   dict.Set("versions", ParsedQuicVersionVectorToString(supported_versions));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicPushPromiseReceivedParams(
+base::Value::Dict NetLogQuicPushPromiseReceivedParams(
     const spdy::Http2HeaderBlock* headers,
     spdy::SpdyStreamId stream_id,
     spdy::SpdyStreamId promised_stream_id,
@@ -322,7 +322,7 @@
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
   dict.Set("id", static_cast<int>(stream_id));
   dict.Set("promised_stream_id", static_cast<int>(promised_stream_id));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // TODO(fayang): Remove this when necessary data is collected.
@@ -3458,7 +3458,7 @@
   LogMigrationResultToHistogram(MIGRATION_STATUS_SUCCESS);
 }
 
-base::Value QuicChromiumClientSession::GetInfoAsValue(
+base::Value::Dict QuicChromiumClientSession::GetInfoAsValue(
     const std::set<HostPortPair>& aliases) {
   base::Value::Dict dict;
   dict.Set("version", ParsedQuicVersionToString(connection()->version()));
@@ -3498,7 +3498,7 @@
   }
   dict.Set("aliases", std::move(alias_list));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 bool QuicChromiumClientSession::gquic_zero_rtt_disabled() const {
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index ac76512..fac69b4 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -26,6 +26,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/load_timing_info.h"
 #include "net/base/net_error_details.h"
@@ -781,7 +782,7 @@
                                 quic::QuicErrorCode quic_error,
                                 quic::ConnectionCloseBehavior behavior);
 
-  base::Value GetInfoAsValue(const std::set<HostPortPair>& aliases);
+  base::Value::Dict GetInfoAsValue(const std::set<HostPortPair>& aliases);
 
   const NetLogWithSource& net_log() const { return net_log_; }
 
diff --git a/net/quic/quic_event_logger.cc b/net/quic/quic_event_logger.cc
index 1d3741f..ccac6385 100644
--- a/net/quic/quic_event_logger.cc
+++ b/net/quic/quic_event_logger.cc
@@ -15,21 +15,23 @@
 
 namespace {
 
-base::Value NetLogQuicPacketParams(const quic::QuicSocketAddress& self_address,
-                                   const quic::QuicSocketAddress& peer_address,
-                                   size_t packet_size) {
+base::Value::Dict NetLogQuicPacketParams(
+    const quic::QuicSocketAddress& self_address,
+    const quic::QuicSocketAddress& peer_address,
+    size_t packet_size) {
   base::Value::Dict dict;
   dict.Set("self_address", self_address.ToString());
   dict.Set("peer_address", peer_address.ToString());
   dict.Set("size", static_cast<int>(packet_size));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicPacketSentParams(quic::QuicPacketNumber packet_number,
-                                       quic::QuicPacketLength packet_length,
-                                       quic::TransmissionType transmission_type,
-                                       quic::EncryptionLevel encryption_level,
-                                       quic::QuicTime sent_time) {
+base::Value::Dict NetLogQuicPacketSentParams(
+    quic::QuicPacketNumber packet_number,
+    quic::QuicPacketLength packet_length,
+    quic::TransmissionType transmission_type,
+    quic::EncryptionLevel encryption_level,
+    quic::QuicTime sent_time) {
   base::Value::Dict dict;
   dict.Set("transmission_type",
            quic::TransmissionTypeToString(transmission_type));
@@ -37,22 +39,23 @@
   dict.Set("size", packet_length);
   dict.Set("sent_time_us", NetLogNumberValue(sent_time.ToDebuggingValue()));
   dict.Set("encryption_level", quic::EncryptionLevelToString(encryption_level));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicPacketLostParams(quic::QuicPacketNumber packet_number,
-                                       quic::TransmissionType transmission_type,
-                                       quic::QuicTime detection_time) {
+base::Value::Dict NetLogQuicPacketLostParams(
+    quic::QuicPacketNumber packet_number,
+    quic::TransmissionType transmission_type,
+    quic::QuicTime detection_time) {
   base::Value::Dict dict;
   dict.Set("transmission_type",
            quic::TransmissionTypeToString(transmission_type));
   dict.Set("packet_number", NetLogNumberValue(packet_number.ToUint64()));
   dict.Set("detection_time_us",
            NetLogNumberValue(detection_time.ToDebuggingValue()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicConfigProcessed(
+base::Value::Dict NetLogQuicConfigProcessed(
     const quic::QuicSentPacketManager::DebugDelegate::SendParameters&
         parameters) {
   base::Value::Dict dict;
@@ -61,17 +64,17 @@
   dict.Set("use_pacing", parameters.use_pacing);
   dict.Set("initial_congestion_window",
            NetLogNumberValue(parameters.initial_congestion_window));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicDuplicatePacketParams(
+base::Value::Dict NetLogQuicDuplicatePacketParams(
     quic::QuicPacketNumber packet_number) {
   base::Value::Dict dict;
   dict.Set("packet_number", NetLogNumberValue(packet_number.ToUint64()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogReceivedQuicPacketHeaderParams(
+base::Value::Dict NetLogReceivedQuicPacketHeaderParams(
     const quic::QuicPacketHeader& header,
     const quic::ParsedQuicVersion& session_version,
     const quic::QuicConnectionId& connection_id,
@@ -107,19 +110,20 @@
     dict.Set("long_header_type",
              quic::QuicLongHeaderTypeToString(header.long_packet_type));
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicStreamFrameParams(const quic::QuicStreamFrame& frame) {
+base::Value::Dict NetLogQuicStreamFrameParams(
+    const quic::QuicStreamFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(frame.stream_id));
   dict.Set("fin", frame.fin);
   dict.Set("offset", NetLogNumberValue(frame.offset));
   dict.Set("length", frame.data_length);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicAckFrameParams(const quic::QuicAckFrame* frame) {
+base::Value::Dict NetLogQuicAckFrameParams(const quic::QuicAckFrame* frame) {
   base::Value::Dict dict;
   dict.Set("largest_observed",
            NetLogNumberValue(frame->largest_acked.ToUint64()));
@@ -155,19 +159,19 @@
   }
   dict.Set("received_packet_times", std::move(received));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicRstStreamFrameParams(
+base::Value::Dict NetLogQuicRstStreamFrameParams(
     const quic::QuicRstStreamFrame* frame) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(frame->stream_id));
   dict.Set("quic_rst_stream_error", static_cast<int>(frame->error_code));
   dict.Set("offset", NetLogNumberValue(frame->byte_offset));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicConnectionCloseFrameParams(
+base::Value::Dict NetLogQuicConnectionCloseFrameParams(
     const quic::QuicConnectionCloseFrame* frame) {
   base::Value::Dict dict;
   dict.Set("quic_error", frame->quic_error_code);
@@ -192,39 +196,41 @@
              NetLogNumberValue(frame->transport_close_frame_type));
   }
   dict.Set("details", frame->error_details);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicWindowUpdateFrameParams(
+base::Value::Dict NetLogQuicWindowUpdateFrameParams(
     const quic::QuicWindowUpdateFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(frame.stream_id));
   dict.Set("byte_offset", NetLogNumberValue(frame.max_data));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicBlockedFrameParams(const quic::QuicBlockedFrame& frame) {
+base::Value::Dict NetLogQuicBlockedFrameParams(
+    const quic::QuicBlockedFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(frame.stream_id));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicGoAwayFrameParams(const quic::QuicGoAwayFrame* frame) {
+base::Value::Dict NetLogQuicGoAwayFrameParams(
+    const quic::QuicGoAwayFrame* frame) {
   base::Value::Dict dict;
   dict.Set("quic_error", frame->error_code);
   dict.Set("last_good_stream_id", static_cast<int>(frame->last_good_stream_id));
   dict.Set("reason_phrase", frame->reason_phrase);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicStopWaitingFrameParams(
+base::Value::Dict NetLogQuicStopWaitingFrameParams(
     const quic::QuicStopWaitingFrame* frame) {
   base::Value::Dict dict;
   dict.Set("least_unacked", NetLogNumberValue(frame->least_unacked.ToUint64()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicVersionNegotiationPacketParams(
+base::Value::Dict NetLogQuicVersionNegotiationPacketParams(
     const quic::QuicVersionNegotiationPacket* packet) {
   base::Value::Dict dict;
   base::Value::List versions;
@@ -232,39 +238,39 @@
     versions.Append(ParsedQuicVersionToString(version));
   }
   dict.Set("versions", std::move(versions));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicPublicResetPacketParams(
+base::Value::Dict NetLogQuicPublicResetPacketParams(
     const IPEndPoint& server_hello_address,
     const quic::QuicSocketAddress& public_reset_address) {
   base::Value::Dict dict;
   dict.Set("server_hello_address", server_hello_address.ToString());
   dict.Set("public_reset_address", public_reset_address.ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicPathData(const quic::QuicPathFrameBuffer& buffer) {
+base::Value::Dict NetLogQuicPathData(const quic::QuicPathFrameBuffer& buffer) {
   base::Value::Dict dict;
   dict.Set("data", NetLogBinaryValue(buffer));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicCryptoHandshakeMessageParams(
+base::Value::Dict NetLogQuicCryptoHandshakeMessageParams(
     const quic::CryptoHandshakeMessage* message) {
   base::Value::Dict dict;
   dict.Set("quic_crypto_handshake_message", message->DebugString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicTransportParametersParams(
+base::Value::Dict NetLogQuicTransportParametersParams(
     const quic::TransportParameters& transport_parameters) {
   base::Value::Dict dict;
   dict.Set("quic_transport_parameters", transport_parameters.ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicZeroRttRejectReason(int reason) {
+base::Value::Dict NetLogQuicZeroRttRejectReason(int reason) {
   base::Value::Dict dict;
   const char* reason_detail = SSL_early_data_reason_string(
       static_cast<ssl_early_data_reason_t>(reason));
@@ -273,10 +279,10 @@
   } else {
     dict.Set("reason", "Unknown reason " + base::NumberToString(reason));
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicOnConnectionClosedParams(
+base::Value::Dict NetLogQuicOnConnectionClosedParams(
     quic::QuicErrorCode error,
     std::string error_details,
     quic::ConnectionCloseSource source) {
@@ -285,10 +291,10 @@
   dict.Set("details", error_details);
   dict.Set("from_peer",
            source == quic::ConnectionCloseSource::FROM_PEER ? true : false);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicCertificateVerifiedParams(
+base::Value::Dict NetLogQuicCertificateVerifiedParams(
     scoped_refptr<X509Certificate> cert) {
   // Only the subjects are logged so that we can investigate connection pooling.
   // More fields could be logged in the future.
@@ -300,11 +306,12 @@
     subjects.Append(std::move(dns_name));
   }
   dict.Set("subjects", std::move(subjects));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicCryptoFrameParams(const quic::QuicCryptoFrame* frame,
-                                        bool has_buffer) {
+base::Value::Dict NetLogQuicCryptoFrameParams(
+    const quic::QuicCryptoFrame* frame,
+    bool has_buffer) {
   base::Value::Dict dict;
   dict.Set("encryption_level", quic::EncryptionLevelToString(frame->level));
   dict.Set("data_length", frame->data_length);
@@ -314,56 +321,56 @@
                           reinterpret_cast<const void*>(frame->data_buffer),
                           frame->data_length));
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicStopSendingFrameParams(
+base::Value::Dict NetLogQuicStopSendingFrameParams(
     const quic::QuicStopSendingFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(frame.stream_id));
   dict.Set("quic_rst_stream_error", static_cast<int>(frame.error_code));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicStreamsBlockedFrameParams(
+base::Value::Dict NetLogQuicStreamsBlockedFrameParams(
     const quic::QuicStreamsBlockedFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_count", static_cast<int>(frame.stream_count));
   dict.Set("is_unidirectional", frame.unidirectional);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicMaxStreamsFrameParams(
+base::Value::Dict NetLogQuicMaxStreamsFrameParams(
     const quic::QuicMaxStreamsFrame& frame) {
   base::Value::Dict dict;
   dict.Set("stream_count", static_cast<int>(frame.stream_count));
   dict.Set("is_unidirectional", frame.unidirectional);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicNewConnectionIdFrameParams(
+base::Value::Dict NetLogQuicNewConnectionIdFrameParams(
     const quic::QuicNewConnectionIdFrame* frame) {
   base::Value::Dict dict;
   dict.Set("connection_id", frame->connection_id.ToString());
   dict.Set("sequence_number", NetLogNumberValue(frame->sequence_number));
   dict.Set("retire_prior_to", NetLogNumberValue(frame->retire_prior_to));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicRetireConnectionIdFrameParams(
+base::Value::Dict NetLogQuicRetireConnectionIdFrameParams(
     const quic::QuicRetireConnectionIdFrame* frame) {
   base::Value::Dict dict;
   dict.Set("sequence_number", NetLogNumberValue(frame->sequence_number));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogQuicNewTokenFrameParams(
+base::Value::Dict NetLogQuicNewTokenFrameParams(
     const quic::QuicNewTokenFrame* frame) {
   base::Value::Dict dict;
   dict.Set("token",
            NetLogBinaryValue(reinterpret_cast<const void*>(frame->token.data()),
                              frame->token.length()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/quic/quic_http3_logger.cc b/net/quic/quic_http3_logger.cc
index e6a450cf..05ed6d31 100644
--- a/net/quic/quic_http3_logger.cc
+++ b/net/quic/quic_http3_logger.cc
@@ -22,7 +22,7 @@
 
 namespace {
 
-base::Value NetLogSettingsParams(const quic::SettingsFrame& frame) {
+base::Value::Dict NetLogSettingsParams(const quic::SettingsFrame& frame) {
   base::Value::Dict dict;
   for (auto setting : frame.values) {
     dict.Set(
@@ -30,38 +30,39 @@
             static_cast<quic::Http3AndQpackSettingsIdentifiers>(setting.first)),
         static_cast<int>(setting.second));
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogPriorityUpdateParams(const quic::PriorityUpdateFrame& frame) {
+base::Value::Dict NetLogPriorityUpdateParams(
+    const quic::PriorityUpdateFrame& frame) {
   base::Value::Dict dict;
   dict.Set("prioritized_element_id",
            NetLogNumberValue(frame.prioritized_element_id));
   dict.Set("priority_field_value", frame.priority_field_value);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogTwoIntParams(base::StringPiece name1,
-                               uint64_t value1,
-                               base::StringPiece name2,
-                               uint64_t value2) {
+base::Value::Dict NetLogTwoIntParams(base::StringPiece name1,
+                                     uint64_t value1,
+                                     base::StringPiece name2,
+                                     uint64_t value2) {
   base::Value::Dict dict;
   dict.Set(name1, NetLogNumberValue(value1));
   dict.Set(name2, NetLogNumberValue(value2));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogThreeIntParams(base::StringPiece name1,
-                                 uint64_t value1,
-                                 base::StringPiece name2,
-                                 uint64_t value2,
-                                 base::StringPiece name3,
-                                 uint64_t value3) {
+base::Value::Dict NetLogThreeIntParams(base::StringPiece name1,
+                                       uint64_t value1,
+                                       base::StringPiece name2,
+                                       uint64_t value2,
+                                       base::StringPiece name3,
+                                       uint64_t value3) {
   base::Value::Dict dict;
   dict.Set(name1, NetLogNumberValue(value1));
   dict.Set(name2, NetLogNumberValue(value2));
   dict.Set(name3, NetLogNumberValue(value3));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 base::Value::List ElideQuicHeaderListForNetLog(
@@ -242,7 +243,7 @@
                  NetLogNumberValue(static_cast<uint64_t>(stream_id)));
         dict.Set("headers",
                  ElideQuicHeaderListForNetLog(headers, capture_mode));
-        return base::Value(std::move(dict));
+        return dict;
       });
 }
 
@@ -318,7 +319,7 @@
                  NetLogNumberValue(static_cast<uint64_t>(stream_id)));
         dict.Set("headers",
                  ElideHttp2HeaderBlockForNetLog(header_block, capture_mode));
-        return base::Value(std::move(dict));
+        return dict;
       });
 }
 
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc
index a88078d..7c3289c 100644
--- a/net/quic/quic_http_stream.cc
+++ b/net/quic/quic_http_stream.cc
@@ -38,12 +38,12 @@
 
 namespace {
 
-base::Value NetLogQuicPushStreamParams(quic::QuicStreamId stream_id,
-                                       const GURL& url) {
+base::Value::Dict NetLogQuicPushStreamParams(quic::QuicStreamId stream_id,
+                                             const GURL& url) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("url", url.spec());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void NetLogQuicPushStream(const NetLogWithSource& net_log1,
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index 6d848318..7cc35e4 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -125,13 +125,10 @@
 // entry is a list of strings, which when interpreted as colon-separated
 // key-value pairs has exactly one entry with |key| and that entry has value
 // |expected_value|.
-bool CheckHeader(const base::Value& params,
+bool CheckHeader(const base::Value::Dict& params,
                  base::StringPiece key,
                  base::StringPiece expected_value) {
-  if (!params.is_dict()) {
-    return false;
-  }
-  const base::Value::List* headers = params.GetDict().FindList("headers");
+  const base::Value::List* headers = params.FindList("headers");
   if (!headers) {
     return false;
   }
diff --git a/net/quic/quic_http_utils.cc b/net/quic/quic_http_utils.cc
index 94c1dcd..3799dc1 100644
--- a/net/quic/quic_http_utils.cc
+++ b/net/quic/quic_http_utils.cc
@@ -25,25 +25,25 @@
                          : static_cast<RequestPriority>(HIGHEST - priority);
 }
 
-base::Value QuicRequestNetLogParams(quic::QuicStreamId stream_id,
-                                    const spdy::Http2HeaderBlock* headers,
-                                    quic::QuicStreamPriority priority,
-                                    NetLogCaptureMode capture_mode) {
-  base::Value dict = Http2HeaderBlockNetLogParams(headers, capture_mode);
-  DCHECK(dict.is_dict());
-  dict.GetDict().Set("quic_priority_urgency", priority.urgency);
-  dict.GetDict().Set("quic_priority_incremental", priority.incremental);
-  dict.GetDict().Set("quic_stream_id", static_cast<int>(stream_id));
+base::Value::Dict QuicRequestNetLogParams(quic::QuicStreamId stream_id,
+                                          const spdy::Http2HeaderBlock* headers,
+                                          quic::QuicStreamPriority priority,
+                                          NetLogCaptureMode capture_mode) {
+  base::Value::Dict dict = Http2HeaderBlockNetLogParams(headers, capture_mode);
+  dict.Set("quic_priority_urgency", priority.urgency);
+  dict.Set("quic_priority_incremental", priority.incremental);
+  dict.Set("quic_stream_id", static_cast<int>(stream_id));
   return dict;
 }
 
-base::Value QuicResponseNetLogParams(quic::QuicStreamId stream_id,
-                                     bool fin_received,
-                                     const spdy::Http2HeaderBlock* headers,
-                                     NetLogCaptureMode capture_mode) {
-  base::Value dict = Http2HeaderBlockNetLogParams(headers, capture_mode);
-  dict.GetDict().Set("quic_stream_id", static_cast<int>(stream_id));
-  dict.GetDict().Set("fin", fin_received);
+base::Value::Dict QuicResponseNetLogParams(
+    quic::QuicStreamId stream_id,
+    bool fin_received,
+    const spdy::Http2HeaderBlock* headers,
+    NetLogCaptureMode capture_mode) {
+  base::Value::Dict dict = Http2HeaderBlockNetLogParams(headers, capture_mode);
+  dict.Set("quic_stream_id", static_cast<int>(stream_id));
+  dict.Set("fin", fin_received);
   return dict;
 }
 
diff --git a/net/quic/quic_http_utils.h b/net/quic/quic_http_utils.h
index 069b441..ea78aa88 100644
--- a/net/quic/quic_http_utils.h
+++ b/net/quic/quic_http_utils.h
@@ -26,14 +26,14 @@
 
 // Converts a spdy::Http2HeaderBlock, stream_id and priority into NetLog event
 // parameters.
-NET_EXPORT base::Value QuicRequestNetLogParams(
+NET_EXPORT base::Value::Dict QuicRequestNetLogParams(
     quic::QuicStreamId stream_id,
     const spdy::Http2HeaderBlock* headers,
     quic::QuicStreamPriority priority,
     NetLogCaptureMode capture_mode);
 
 // Converts a spdy::Http2HeaderBlock and stream into NetLog event parameters.
-NET_EXPORT base::Value QuicResponseNetLogParams(
+NET_EXPORT base::Value::Dict QuicResponseNetLogParams(
     quic::QuicStreamId stream_id,
     bool fin_received,
     const spdy::Http2HeaderBlock* headers,
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 1577ed51..b6715ef6 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -109,7 +109,7 @@
   kMaxValue = kCryptoConnectFailedAsync,
 };
 
-base::Value NetLogQuicStreamFactoryJobParams(
+base::Value::Dict NetLogQuicStreamFactoryJobParams(
     const QuicStreamFactory::QuicSessionAliasKey* key) {
   base::Value::Dict dict;
   dict.Set("host", key->server_id().host());
@@ -118,7 +118,7 @@
            PrivacyModeToDebugString(key->session_key().privacy_mode()));
   dict.Set("network_anonymization_key",
            key->session_key().network_anonymization_key().ToDebugString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 std::string QuicPlatformNotificationToString(
diff --git a/net/socket/client_socket_pool.cc b/net/socket/client_socket_pool.cc
index 2c0504c..fef3eee 100644
--- a/net/socket/client_socket_pool.cc
+++ b/net/socket/client_socket_pool.cc
@@ -163,10 +163,11 @@
                    [&] { return NetLogGroupIdParams(group_id); });
 }
 
-base::Value ClientSocketPool::NetLogGroupIdParams(const GroupId& group_id) {
+base::Value::Dict ClientSocketPool::NetLogGroupIdParams(
+    const GroupId& group_id) {
   base::Value::Dict event_params;
   event_params.Set("group_id", group_id.ToString());
-  return base::Value(std::move(event_params));
+  return event_params;
 }
 
 std::unique_ptr<ConnectJob> ClientSocketPool::CreateConnectJob(
diff --git a/net/socket/client_socket_pool.h b/net/socket/client_socket_pool.h
index 4fa4245..b63e5dd 100644
--- a/net/socket/client_socket_pool.h
+++ b/net/socket/client_socket_pool.h
@@ -350,7 +350,7 @@
                                                 const GroupId& group_id);
 
   // Utility method to log a GroupId with a NetLog event.
-  static base::Value NetLogGroupIdParams(const GroupId& group_id);
+  static base::Value::Dict NetLogGroupIdParams(const GroupId& group_id);
 
   std::unique_ptr<ConnectJob> CreateConnectJob(
       GroupId group_id,
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index b17ecca..d65711f2 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -680,9 +680,7 @@
         NetLogEventPhase::NONE);
     ASSERT_EQ(1u, entries.size());
     ASSERT_TRUE(entries[0].HasParams());
-    ASSERT_TRUE(entries[0].params.is_dict());
-    const std::string* reason =
-        entries[0].params.GetDict().FindString("reason");
+    const std::string* reason = entries[0].params.FindString("reason");
     ASSERT_TRUE(reason);
     EXPECT_EQ(expected_reason, *reason);
   }
diff --git a/net/socket/socket_net_log_params.cc b/net/socket/socket_net_log_params.cc
index 4c520f9..ba91ae3b 100644
--- a/net/socket/socket_net_log_params.cc
+++ b/net/socket/socket_net_log_params.cc
@@ -16,11 +16,11 @@
 
 namespace net {
 
-base::Value NetLogSocketErrorParams(int net_error, int os_error) {
+base::Value::Dict NetLogSocketErrorParams(int net_error, int os_error) {
   base::Value::Dict dict;
   dict.Set("net_error", net_error);
   dict.Set("os_error", os_error);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void NetLogSocketError(const NetLogWithSource& net_log,
@@ -31,25 +31,26 @@
       type, [&] { return NetLogSocketErrorParams(net_error, os_error); });
 }
 
-base::Value CreateNetLogHostPortPairParams(const HostPortPair* host_and_port) {
+base::Value::Dict CreateNetLogHostPortPairParams(
+    const HostPortPair* host_and_port) {
   base::Value::Dict dict;
   dict.Set("host_and_port", host_and_port->ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value CreateNetLogIPEndPointParams(const IPEndPoint* address) {
+base::Value::Dict CreateNetLogIPEndPointParams(const IPEndPoint* address) {
   base::Value::Dict dict;
   dict.Set("address", address->ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value CreateNetLogAddressPairParams(
+base::Value::Dict CreateNetLogAddressPairParams(
     const net::IPEndPoint& local_address,
     const net::IPEndPoint& remote_address) {
   base::Value::Dict dict;
   dict.Set("local_address", local_address.ToString());
   dict.Set("remote_address", remote_address.ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/socket/socket_net_log_params.h b/net/socket/socket_net_log_params.h
index ced0d41..6d3b649 100644
--- a/net/socket/socket_net_log_params.h
+++ b/net/socket/socket_net_log_params.h
@@ -5,12 +5,9 @@
 #ifndef NET_SOCKET_SOCKET_NET_LOG_PARAMS_H_
 #define NET_SOCKET_SOCKET_NET_LOG_PARAMS_H_
 
+#include "base/values.h"
 #include "net/log/net_log_event_type.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class NetLogWithSource;
@@ -24,14 +21,15 @@
                        int os_error);
 
 // Creates a NetLog parameters for a HostPortPair.
-base::Value CreateNetLogHostPortPairParams(const HostPortPair* host_and_port);
+base::Value::Dict CreateNetLogHostPortPairParams(
+    const HostPortPair* host_and_port);
 
 // Creates a NetLog parameters for an IPEndPoint.
-base::Value CreateNetLogIPEndPointParams(const IPEndPoint* address);
+base::Value::Dict CreateNetLogIPEndPointParams(const IPEndPoint* address);
 
 // Creates a NetLog parameters for the local and remote IPEndPoints on connect
 // events.
-base::Value CreateNetLogAddressPairParams(
+base::Value::Dict CreateNetLogAddressPairParams(
     const net::IPEndPoint& local_address,
     const net::IPEndPoint& remote_address);
 
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index 5ab4731..2d8c28d 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -84,19 +84,19 @@
 // Default size of the internal BoringSSL buffers.
 const int kDefaultOpenSSLBufferSize = 17 * 1024;
 
-base::Value NetLogPrivateKeyOperationParams(uint16_t algorithm,
-                                            SSLPrivateKey* key) {
+base::Value::Dict NetLogPrivateKeyOperationParams(uint16_t algorithm,
+                                                  SSLPrivateKey* key) {
   base::Value::Dict dict;
   dict.Set("algorithm",
            SSL_get_signature_algorithm_name(algorithm, 0 /* exclude curve */));
   dict.Set("provider", key->GetProviderName());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSSLInfoParams(SSLClientSocketImpl* socket) {
+base::Value::Dict NetLogSSLInfoParams(SSLClientSocketImpl* socket) {
   SSLInfo ssl_info;
   if (!socket->GetSSLInfo(&ssl_info))
-    return base::Value();
+    return base::Value::Dict();
 
   base::Value::Dict dict;
   const char* version_str;
@@ -112,22 +112,22 @@
 
   dict.Set("next_proto", NextProtoToString(socket->GetNegotiatedProtocol()));
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSSLAlertParams(const void* bytes, size_t len) {
+base::Value::Dict NetLogSSLAlertParams(const void* bytes, size_t len) {
   base::Value::Dict dict;
   dict.Set("bytes", NetLogBinaryValue(bytes, len));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSSLMessageParams(bool is_write,
-                                   const void* bytes,
-                                   size_t len,
-                                   NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogSSLMessageParams(bool is_write,
+                                         const void* bytes,
+                                         size_t len,
+                                         NetLogCaptureMode capture_mode) {
   if (len == 0) {
     NOTREACHED();
-    return base::Value();
+    return base::Value::Dict();
   }
 
   base::Value::Dict dict;
@@ -145,7 +145,7 @@
     dict.Set("bytes", NetLogBinaryValue(bytes, len));
   }
 
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // This enum is used in histograms, so values may not be reused.
@@ -924,7 +924,7 @@
     net_log_.AddEvent(NetLogEventType::SSL_ECH_CONFIG_LIST, [&] {
       base::Value::Dict dict;
       dict.Set("bytes", NetLogBinaryValue(ssl_config_.ech_config_list));
-      return base::Value(std::move(dict));
+      return dict;
     });
     if (!SSL_set1_ech_config_list(ssl_.get(),
                                   ssl_config_.ech_config_list.data(),
@@ -1156,7 +1156,7 @@
   net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED, [&] {
     base::Value::Dict dict;
     dict.Set("certificates", NetLogX509CertificateList(server_cert_.get()));
-    return base::Value(std::move(dict));
+    return dict;
   });
 
   // If the certificate is bad and has been previously accepted, use
diff --git a/net/socket/ssl_connect_job.cc b/net/socket/ssl_connect_job.cc
index bd3c3754..a5fe097 100644
--- a/net/socket/ssl_connect_job.cc
+++ b/net/socket/ssl_connect_job.cc
@@ -466,7 +466,7 @@
         NetLogEventType::SSL_CONNECT_JOB_RESTART_WITH_ECH_CONFIG_LIST, [&] {
           base::Value::Dict dict;
           dict.Set("bytes", NetLogBinaryValue(*ech_retry_configs_));
-          return base::Value(std::move(dict));
+          return dict;
         });
 
     // TODO(https://crbug.com/1091403): Add histograms for how often this
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index e0e2e47..602e1f3 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -41,13 +41,13 @@
 // after a certain timeout has passed without receiving an ACK.
 bool g_connect_backup_jobs_enabled = true;
 
-base::Value NetLogCreateConnectJobParams(
+base::Value::Dict NetLogCreateConnectJobParams(
     bool backup_job,
     const ClientSocketPool::GroupId* group_id) {
   base::Value::Dict dict;
   dict.Set("backup_job", backup_job);
   dict.Set("group_id", group_id->ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/socket/transport_connect_sub_job.cc b/net/socket/transport_connect_sub_job.cc
index e7f43e6..e890ad4 100644
--- a/net/socket/transport_connect_sub_job.cc
+++ b/net/socket/transport_connect_sub_job.cc
@@ -227,7 +227,7 @@
     base::Value::Dict dict;
     dict.Set("address", CurrentAddress().ToString());
     transport_socket_->NetLog().source().AddToEventParameters(dict);
-    return base::Value(std::move(dict));
+    return dict;
   });
 
   // If `websocket_endpoint_lock_manager_` is non-null, this class now owns an
diff --git a/net/socket/udp_net_log_parameters.cc b/net/socket/udp_net_log_parameters.cc
index 7c432ab..b5b605d 100644
--- a/net/socket/udp_net_log_parameters.cc
+++ b/net/socket/udp_net_log_parameters.cc
@@ -15,26 +15,26 @@
 
 namespace {
 
-base::Value NetLogUDPDataTransferParams(int byte_count,
-                                        const char* bytes,
-                                        const IPEndPoint* address,
-                                        NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogUDPDataTransferParams(int byte_count,
+                                              const char* bytes,
+                                              const IPEndPoint* address,
+                                              NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("byte_count", byte_count);
   if (NetLogCaptureIncludesSocketBytes(capture_mode))
     dict.Set("bytes", NetLogBinaryValue(bytes, byte_count));
   if (address)
     dict.Set("address", address->ToString());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogUDPConnectParams(const IPEndPoint& address,
-                                   handles::NetworkHandle network) {
+base::Value::Dict NetLogUDPConnectParams(const IPEndPoint& address,
+                                         handles::NetworkHandle network) {
   base::Value::Dict dict;
   dict.Set("address", address.ToString());
   if (network != handles::kInvalidNetworkHandle)
     dict.Set("bound_to_network", static_cast<int>(network));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
@@ -51,8 +51,8 @@
   });
 }
 
-base::Value CreateNetLogUDPConnectParams(const IPEndPoint& address,
-                                         handles::NetworkHandle network) {
+base::Value::Dict CreateNetLogUDPConnectParams(const IPEndPoint& address,
+                                               handles::NetworkHandle network) {
   return NetLogUDPConnectParams(address, network);
 }
 
diff --git a/net/socket/udp_net_log_parameters.h b/net/socket/udp_net_log_parameters.h
index 155986b..0b6851a 100644
--- a/net/socket/udp_net_log_parameters.h
+++ b/net/socket/udp_net_log_parameters.h
@@ -5,13 +5,10 @@
 #ifndef NET_SOCKET_UDP_NET_LOG_PARAMETERS_H_
 #define NET_SOCKET_UDP_NET_LOG_PARAMETERS_H_
 
+#include "base/values.h"
 #include "net/base/network_handle.h"
 #include "net/log/net_log_event_type.h"
 
-namespace base {
-class Value;
-}
-
 namespace net {
 
 class NetLogWithSource;
@@ -27,8 +24,8 @@
                            const IPEndPoint* address);
 
 // Creates NetLog parameters describing a UDP connect event.
-base::Value CreateNetLogUDPConnectParams(const IPEndPoint& address,
-                                         handles::NetworkHandle network);
+base::Value::Dict CreateNetLogUDPConnectParams(const IPEndPoint& address,
+                                               handles::NetworkHandle network);
 
 }  // namespace net
 
diff --git a/net/spdy/header_coalescer.cc b/net/spdy/header_coalescer.cc
index 0244993..4a1b31a 100644
--- a/net/spdy/header_coalescer.cc
+++ b/net/spdy/header_coalescer.cc
@@ -35,7 +35,7 @@
                                   capture_mode, std::string(header_name),
                                   std::string(header_value))));
                      dict.Set("error", error_message);
-                     return base::Value(std::move(dict));
+                     return dict;
                    });
 }
 
diff --git a/net/spdy/spdy_log_util.cc b/net/spdy/spdy_log_util.cc
index 313aac6..15a379f 100644
--- a/net/spdy/spdy_log_util.cc
+++ b/net/spdy/spdy_log_util.cc
@@ -40,11 +40,12 @@
   return headers_list;
 }
 
-base::Value Http2HeaderBlockNetLogParams(const spdy::Http2HeaderBlock* headers,
-                                         NetLogCaptureMode capture_mode) {
+base::Value::Dict Http2HeaderBlockNetLogParams(
+    const spdy::Http2HeaderBlock* headers,
+    NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/spdy/spdy_log_util.h b/net/spdy/spdy_log_util.h
index d9c650b7..57dd70ef 100644
--- a/net/spdy/spdy_log_util.h
+++ b/net/spdy/spdy_log_util.h
@@ -27,7 +27,7 @@
     NetLogCaptureMode capture_mode);
 
 // Converts a spdy::Http2HeaderBlock into NetLog event parameters.
-NET_EXPORT_PRIVATE base::Value Http2HeaderBlockNetLogParams(
+NET_EXPORT_PRIVATE base::Value::Dict Http2HeaderBlockNetLogParams(
     const spdy::Http2HeaderBlock* headers,
     NetLogCaptureMode capture_mode);
 
diff --git a/net/spdy/spdy_log_util_unittest.cc b/net/spdy/spdy_log_util_unittest.cc
index 9db4636..06ac767 100644
--- a/net/spdy/spdy_log_util_unittest.cc
+++ b/net/spdy/spdy_log_util_unittest.cc
@@ -65,14 +65,12 @@
   headers["foo"] = "bar";
   headers["cookie"] = "name=value";
 
-  std::unique_ptr<base::Value> dict = base::Value::ToUniquePtrValue(
-      Http2HeaderBlockNetLogParams(&headers, NetLogCaptureMode::kDefault));
+  base::Value::Dict dict =
+      Http2HeaderBlockNetLogParams(&headers, NetLogCaptureMode::kDefault);
 
-  ASSERT_TRUE(dict);
-  ASSERT_TRUE(dict->is_dict());
-  ASSERT_EQ(1u, dict->GetDict().size());
+  ASSERT_EQ(1u, dict.size());
 
-  auto* header_list = dict->GetDict().FindList("headers");
+  auto* header_list = dict.FindList("headers");
   ASSERT_TRUE(header_list);
   ASSERT_EQ(2u, header_list->size());
 
@@ -82,14 +80,12 @@
   ASSERT_TRUE((*header_list)[1].is_string());
   EXPECT_EQ("cookie: [10 bytes were stripped]", (*header_list)[1].GetString());
 
-  dict = base::Value::ToUniquePtrValue(Http2HeaderBlockNetLogParams(
-      &headers, NetLogCaptureMode::kIncludeSensitive));
+  dict = Http2HeaderBlockNetLogParams(&headers,
+                                      NetLogCaptureMode::kIncludeSensitive);
 
-  ASSERT_TRUE(dict);
-  ASSERT_TRUE(dict->is_dict());
-  ASSERT_EQ(1u, dict->GetDict().size());
+  ASSERT_EQ(1u, dict.size());
 
-  header_list = dict->GetDict().FindList("headers");
+  header_list = dict.FindList("headers");
   ASSERT_TRUE(header_list);
   ASSERT_EQ(2u, header_list->size());
 
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 47c352a..178e842 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -327,8 +327,7 @@
     ASSERT_FALSE(upload_data_stream_);
     base::FilePath file_path;
     CHECK(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &file_path));
-    CHECK_EQ(static_cast<int>(kUploadDataSize),
-             base::WriteFile(file_path, kUploadData, kUploadDataSize));
+    CHECK(base::WriteFile(file_path, kUploadData));
 
     std::vector<std::unique_ptr<UploadElementReader>> element_readers;
     element_readers.push_back(std::make_unique<UploadFileElementReader>(
@@ -347,8 +346,7 @@
     ASSERT_FALSE(upload_data_stream_);
     base::FilePath file_path;
     CHECK(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &file_path));
-    CHECK_EQ(static_cast<int>(kUploadDataSize),
-             base::WriteFile(file_path, kUploadData, kUploadDataSize));
+    CHECK(base::WriteFile(file_path, kUploadData));
     CHECK(base::MakeFileUnreadable(file_path));
 
     std::vector<std::unique_ptr<UploadElementReader>> element_readers;
@@ -370,8 +368,7 @@
 
     base::FilePath file_path;
     CHECK(base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &file_path));
-    CHECK_EQ(static_cast<int>(kUploadDataSize),
-             base::WriteFile(file_path, kUploadData, kUploadDataSize));
+    CHECK(base::WriteFile(file_path, kUploadData));
 
     std::vector<std::unique_ptr<UploadElementReader>> element_readers;
     element_readers.push_back(std::make_unique<UploadBytesElementReader>(
@@ -4952,7 +4949,7 @@
                                    NetLogEventPhase::NONE);
 
   ASSERT_TRUE(entries[pos].HasParams());
-  auto* header_list = entries[pos].params.GetDict().FindList("headers");
+  auto* header_list = entries[pos].params.FindList("headers");
   ASSERT_TRUE(header_list);
   ASSERT_EQ(5u, header_list->size());
 
@@ -10591,9 +10588,8 @@
       NetLogEventPhase::NONE);
   ASSERT_LT(pos, entries.size());
 
-  const base::Value& params = entries[pos].params;
-  const base::Value::List* const settings =
-      params.GetDict().FindList("settings");
+  const base::Value::Dict& params = entries[pos].params;
+  const base::Value::List* const settings = params.FindList("settings");
   ASSERT_TRUE(settings);
 
   ASSERT_FALSE(settings->empty());
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index f9a56ef..4e2feb1c 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -238,15 +238,16 @@
   base::UmaHistogramBoolean("Net.SpdySession.AcceptChForOrigin", value);
 }
 
-base::Value NetLogSpdyHeadersSentParams(const spdy::Http2HeaderBlock* headers,
-                                        bool fin,
-                                        spdy::SpdyStreamId stream_id,
-                                        bool has_priority,
-                                        int weight,
-                                        spdy::SpdyStreamId parent_stream_id,
-                                        bool exclusive,
-                                        NetLogSource source_dependency,
-                                        NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogSpdyHeadersSentParams(
+    const spdy::Http2HeaderBlock* headers,
+    bool fin,
+    spdy::SpdyStreamId stream_id,
+    bool has_priority,
+    int weight,
+    spdy::SpdyStreamId parent_stream_id,
+    bool exclusive,
+    NetLogSource source_dependency,
+    NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
   dict.Set("fin", fin);
@@ -260,10 +261,10 @@
   if (source_dependency.IsValid()) {
     source_dependency.AddToEventParameters(dict);
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyHeadersReceivedParams(
+base::Value::Dict NetLogSpdyHeadersReceivedParams(
     const spdy::Http2HeaderBlock* headers,
     bool fin,
     spdy::SpdyStreamId stream_id,
@@ -272,34 +273,35 @@
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
   dict.Set("fin", fin);
   dict.Set("stream_id", static_cast<int>(stream_id));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySessionCloseParams(int net_error,
-                                         const std::string& description) {
+base::Value::Dict NetLogSpdySessionCloseParams(int net_error,
+                                               const std::string& description) {
   base::Value::Dict dict;
   dict.Set("net_error", net_error);
   dict.Set("description", description);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySessionParams(const HostPortProxyPair& host_pair) {
+base::Value::Dict NetLogSpdySessionParams(const HostPortProxyPair& host_pair) {
   base::Value::Dict dict;
   dict.Set("host", host_pair.first.ToString());
   dict.Set("proxy", ProxyServerToPacResultElement(host_pair.second));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyInitializedParams(NetLogSource source) {
+base::Value::Dict NetLogSpdyInitializedParams(NetLogSource source) {
   base::Value::Dict dict;
   if (source.IsValid()) {
     source.AddToEventParameters(dict);
   }
   dict.Set("protocol", NextProtoToString(kProtoHTTP2));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySendSettingsParams(const spdy::SettingsMap* settings) {
+base::Value::Dict NetLogSpdySendSettingsParams(
+    const spdy::SettingsMap* settings) {
   base::Value::Dict dict;
   base::Value::List settings_list;
   for (const auto& setting : *settings) {
@@ -310,87 +312,91 @@
                            spdy::SettingsIdToString(id).c_str(), value));
   }
   dict.Set("settings", std::move(settings_list));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyRecvAcceptChParams(spdy::AcceptChOriginValuePair entry) {
+base::Value::Dict NetLogSpdyRecvAcceptChParams(
+    spdy::AcceptChOriginValuePair entry) {
   base::Value::Dict dict;
   dict.Set("origin", entry.origin);
   dict.Set("accept_ch", entry.value);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyRecvSettingParams(spdy::SpdySettingsId id,
-                                        uint32_t value) {
+base::Value::Dict NetLogSpdyRecvSettingParams(spdy::SpdySettingsId id,
+                                              uint32_t value) {
   base::Value::Dict dict;
   dict.Set("id", base::StringPrintf("%u (%s)", id,
                                     spdy::SettingsIdToString(id).c_str()));
   dict.Set("value", static_cast<int>(value));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyWindowUpdateFrameParams(spdy::SpdyStreamId stream_id,
-                                              uint32_t delta) {
+base::Value::Dict NetLogSpdyWindowUpdateFrameParams(
+    spdy::SpdyStreamId stream_id,
+    uint32_t delta) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("delta", static_cast<int>(delta));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySessionWindowUpdateParams(int32_t delta,
-                                                int32_t window_size) {
+base::Value::Dict NetLogSpdySessionWindowUpdateParams(int32_t delta,
+                                                      int32_t window_size) {
   base::Value::Dict dict;
   dict.Set("delta", delta);
   dict.Set("window_size", window_size);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyDataParams(spdy::SpdyStreamId stream_id,
-                                 int size,
-                                 bool fin) {
+base::Value::Dict NetLogSpdyDataParams(spdy::SpdyStreamId stream_id,
+                                       int size,
+                                       bool fin) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("size", size);
   dict.Set("fin", fin);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyRecvRstStreamParams(spdy::SpdyStreamId stream_id,
-                                          spdy::SpdyErrorCode error_code) {
+base::Value::Dict NetLogSpdyRecvRstStreamParams(
+    spdy::SpdyStreamId stream_id,
+    spdy::SpdyErrorCode error_code) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("error_code", base::StringPrintf("%u (%s)", error_code,
                                             ErrorCodeToString(error_code)));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySendRstStreamParams(spdy::SpdyStreamId stream_id,
-                                          spdy::SpdyErrorCode error_code,
-                                          const std::string& description) {
+base::Value::Dict NetLogSpdySendRstStreamParams(
+    spdy::SpdyStreamId stream_id,
+    spdy::SpdyErrorCode error_code,
+    const std::string& description) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("error_code", base::StringPrintf("%u (%s)", error_code,
                                             ErrorCodeToString(error_code)));
   dict.Set("description", description);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyPingParams(spdy::SpdyPingId unique_id,
-                                 bool is_ack,
-                                 const char* type) {
+base::Value::Dict NetLogSpdyPingParams(spdy::SpdyPingId unique_id,
+                                       bool is_ack,
+                                       const char* type) {
   base::Value::Dict dict;
   dict.Set("unique_id", static_cast<int>(unique_id));
   dict.Set("type", type);
   dict.Set("is_ack", is_ack);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyRecvGoAwayParams(spdy::SpdyStreamId last_stream_id,
-                                       int active_streams,
-                                       int unclaimed_streams,
-                                       spdy::SpdyErrorCode error_code,
-                                       base::StringPiece debug_data,
-                                       NetLogCaptureMode capture_mode) {
+base::Value::Dict NetLogSpdyRecvGoAwayParams(spdy::SpdyStreamId last_stream_id,
+                                             int active_streams,
+                                             int unclaimed_streams,
+                                             spdy::SpdyErrorCode error_code,
+                                             base::StringPiece debug_data,
+                                             NetLogCaptureMode capture_mode) {
   base::Value::Dict dict;
   dict.Set("last_accepted_stream_id", static_cast<int>(last_stream_id));
   dict.Set("active_streams", active_streams);
@@ -399,10 +405,10 @@
                                             ErrorCodeToString(error_code)));
   dict.Set("debug_data",
            ElideGoAwayDebugDataForNetLog(capture_mode, debug_data));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyPushPromiseReceivedParams(
+base::Value::Dict NetLogSpdyPushPromiseReceivedParams(
     const spdy::Http2HeaderBlock* headers,
     spdy::SpdyStreamId stream_id,
     spdy::SpdyStreamId promised_stream_id,
@@ -411,55 +417,56 @@
   dict.Set("headers", ElideHttp2HeaderBlockForNetLog(*headers, capture_mode));
   dict.Set("id", static_cast<int>(stream_id));
   dict.Set("promised_stream_id", static_cast<int>(promised_stream_id));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyAdoptedPushStreamParams(spdy::SpdyStreamId stream_id,
-                                              const GURL& url) {
+base::Value::Dict NetLogSpdyAdoptedPushStreamParams(
+    spdy::SpdyStreamId stream_id,
+    const GURL& url) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("url", url.spec());
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdySessionStalledParams(size_t num_active_streams,
-                                           size_t num_created_streams,
-                                           size_t num_pushed_streams,
-                                           size_t max_concurrent_streams,
-                                           const std::string& url) {
+base::Value::Dict NetLogSpdySessionStalledParams(size_t num_active_streams,
+                                                 size_t num_created_streams,
+                                                 size_t num_pushed_streams,
+                                                 size_t max_concurrent_streams,
+                                                 const std::string& url) {
   base::Value::Dict dict;
   dict.Set("num_active_streams", static_cast<int>(num_active_streams));
   dict.Set("num_created_streams", static_cast<int>(num_created_streams));
   dict.Set("num_pushed_streams", static_cast<int>(num_pushed_streams));
   dict.Set("max_concurrent_streams", static_cast<int>(max_concurrent_streams));
   dict.Set("url", url);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyPriorityParams(spdy::SpdyStreamId stream_id,
-                                     spdy::SpdyStreamId parent_stream_id,
-                                     int weight,
-                                     bool exclusive) {
+base::Value::Dict NetLogSpdyPriorityParams(spdy::SpdyStreamId stream_id,
+                                           spdy::SpdyStreamId parent_stream_id,
+                                           int weight,
+                                           bool exclusive) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("parent_stream_id", static_cast<int>(parent_stream_id));
   dict.Set("weight", weight);
   dict.Set("exclusive", exclusive);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyGreasedFrameParams(spdy::SpdyStreamId stream_id,
-                                         uint8_t type,
-                                         uint8_t flags,
-                                         size_t length,
-                                         RequestPriority priority) {
+base::Value::Dict NetLogSpdyGreasedFrameParams(spdy::SpdyStreamId stream_id,
+                                               uint8_t type,
+                                               uint8_t flags,
+                                               size_t length,
+                                               RequestPriority priority) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("type", type);
   dict.Set("flags", flags);
   dict.Set("length", static_cast<int>(length));
   dict.Set("priority", RequestPriorityToString(priority));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Helper function to return the total size of an array of objects
@@ -1557,7 +1564,7 @@
   }
 }
 
-base::Value SpdySession::GetInfoAsValue() const {
+base::Value::Dict SpdySession::GetInfoAsValue() const {
   base::Value::Dict dict;
 
   dict.Set("source_id", static_cast<int>(net_log_.source().id));
@@ -1597,7 +1604,7 @@
   dict.Set("send_window_size", session_send_window_size_);
   dict.Set("recv_window_size", session_recv_window_size_);
   dict.Set("unacked_recv_window_bytes", session_unacked_recv_window_bytes_);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 bool SpdySession::IsReused() const {
diff --git a/net/spdy/spdy_session.h b/net/spdy/spdy_session.h
index a264965..fbae3fe9 100644
--- a/net/spdy/spdy_session.h
+++ b/net/spdy/spdy_session.h
@@ -23,6 +23,7 @@
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "base/values.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/host_port_pair.h"
 #include "net/base/io_buffer.h"
@@ -594,7 +595,7 @@
 
   // Retrieves information on the current state of the SPDY session as a
   // Value.
-  base::Value GetInfoAsValue() const;
+  base::Value::Dict GetInfoAsValue() const;
 
   // Indicates whether the session is being reused after having successfully
   // used to send/receive data in the past or if the underlying socket was idle
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index 95bca028..34a3150 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -2253,7 +2253,7 @@
 // Attempts to extract a NetLogSource from a set of event parameters.  Returns
 // true and writes the result to |source| on success.  Returns false and
 // makes |source| an invalid source on failure.
-bool NetLogSourceFromEventParameters(const base::Value* event_params,
+bool NetLogSourceFromEventParameters(const base::Value::Dict* event_params,
                                      NetLogSource* source) {
   const base::Value::Dict* source_dict = nullptr;
   int source_id = -1;
@@ -2262,7 +2262,7 @@
     *source = NetLogSource();
     return false;
   }
-  source_dict = event_params->GetDict().FindDict("source_dependency");
+  source_dict = event_params->FindDict("source_dependency");
   if (!source_dict) {
     *source = NetLogSource();
     return false;
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index f952cc1..2d6153c 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -34,34 +34,35 @@
 
 namespace {
 
-base::Value NetLogSpdyStreamErrorParams(spdy::SpdyStreamId stream_id,
-                                        int net_error,
-                                        base::StringPiece description) {
+base::Value::Dict NetLogSpdyStreamErrorParams(spdy::SpdyStreamId stream_id,
+                                              int net_error,
+                                              base::StringPiece description) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("net_error", ErrorToShortString(net_error));
   dict.Set("description", description);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyStreamWindowUpdateParams(spdy::SpdyStreamId stream_id,
-                                               int32_t delta,
-                                               int32_t window_size) {
+base::Value::Dict NetLogSpdyStreamWindowUpdateParams(
+    spdy::SpdyStreamId stream_id,
+    int32_t delta,
+    int32_t window_size) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("delta", delta);
   dict.Set("window_size", window_size);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogSpdyDataParams(spdy::SpdyStreamId stream_id,
-                                 int size,
-                                 bool fin) {
+base::Value::Dict NetLogSpdyDataParams(spdy::SpdyStreamId stream_id,
+                                       int size,
+                                       bool fin) {
   base::Value::Dict dict;
   dict.Set("stream_id", static_cast<int>(stream_id));
   dict.Set("size", size);
   dict.Set("fin", fin);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/ssl/openssl_ssl_util.cc b/net/ssl/openssl_ssl_util.cc
index ab2316d..711a948 100644
--- a/net/ssl/openssl_ssl_util.cc
+++ b/net/ssl/openssl_ssl_util.cc
@@ -126,9 +126,9 @@
   }
 }
 
-base::Value NetLogOpenSSLErrorParams(int net_error,
-                                     int ssl_error,
-                                     const OpenSSLErrorInfo& error_info) {
+base::Value::Dict NetLogOpenSSLErrorParams(int net_error,
+                                           int ssl_error,
+                                           const OpenSSLErrorInfo& error_info) {
   base::Value::Dict dict;
   dict.Set("net_error", net_error);
   dict.Set("ssl_error", ssl_error);
@@ -140,7 +140,7 @@
     dict.Set("file", error_info.file);
   if (error_info.line != 0)
     dict.Set("line", error_info.line);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
index efb0271b..0ad3f4fc 100644
--- a/net/url_request/url_request.cc
+++ b/net/url_request/url_request.cc
@@ -281,7 +281,7 @@
                             std::u16string());
 }
 
-base::Value URLRequest::GetStateAsValue() const {
+base::Value::Dict URLRequest::GetStateAsValue() const {
   base::Value::Dict dict;
   dict.Set("url", original_url().possibly_invalid_spec());
 
@@ -314,7 +314,7 @@
 
   if (status_ != OK)
     dict.Set("net_error", status_);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 void URLRequest::LogBlockedBy(base::StringPiece blocked_by) {
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h
index 418fc314..261342a5 100644
--- a/net/url_request/url_request.h
+++ b/net/url_request/url_request.h
@@ -19,6 +19,7 @@
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/types/pass_key.h"
+#include "base/values.h"
 #include "net/base/auth.h"
 #include "net/base/completion_repeating_callback.h"
 #include "net/base/idempotency.h"
@@ -57,10 +58,6 @@
 #include "url/gurl.h"
 #include "url/origin.h"
 
-namespace base {
-class Value;
-}  // namespace base
-
 namespace net {
 
 class CookieOptions;
@@ -472,7 +469,7 @@
 
   // Returns a partial representation of the request's state as a value, for
   // debugging.
-  base::Value GetStateAsValue() const;
+  base::Value::Dict GetStateAsValue() const;
 
   // Logs information about the what external object currently blocking the
   // request.  LogUnblocked must be called before resuming the request.  This
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 48d7ae0..5f3a50e 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -101,7 +101,7 @@
 
 namespace {
 
-base::Value CookieInclusionStatusNetLogParams(
+base::Value::Dict CookieInclusionStatusNetLogParams(
     const std::string& operation,
     const std::string& cookie_name,
     const std::string& cookie_domain,
@@ -119,7 +119,7 @@
     if (!cookie_path.empty())
       dict.Set("path", cookie_path);
   }
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // Records details about the most-specific trust anchor in |spki_hashes|,
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 5f4e34f..b087417 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -40,10 +40,10 @@
 namespace {
 
 // Callback for TYPE_URL_REQUEST_FILTERS_SET net-internals event.
-base::Value SourceStreamSetParams(SourceStream* source_stream) {
+base::Value::Dict SourceStreamSetParams(SourceStream* source_stream) {
   base::Value::Dict event_params;
   event_params.Set("filters", source_stream->Description());
-  return base::Value(std::move(event_params));
+  return event_params;
 }
 
 }  // namespace
diff --git a/net/url_request/url_request_netlog_params.cc b/net/url_request/url_request_netlog_params.cc
index 1e05d6ec..323b62f 100644
--- a/net/url_request/url_request_netlog_params.cc
+++ b/net/url_request/url_request_netlog_params.cc
@@ -16,7 +16,7 @@
 
 namespace net {
 
-base::Value NetLogURLRequestConstructorParams(
+base::Value::Dict NetLogURLRequestConstructorParams(
     const GURL& url,
     RequestPriority priority,
     NetworkTrafficAnnotationTag traffic_annotation) {
@@ -24,10 +24,10 @@
   dict.Set("url", url.possibly_invalid_spec());
   dict.Set("priority", RequestPriorityToString(priority));
   dict.Set("traffic_annotation", traffic_annotation.unique_id_hash_code);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogURLRequestStartParams(
+base::Value::Dict NetLogURLRequestStartParams(
     const GURL& url,
     const std::string& method,
     int load_flags,
@@ -59,7 +59,7 @@
            initiator.has_value() ? initiator->Serialize() : "not an origin");
   if (upload_id > -1)
     dict.Set("upload_id", base::NumberToString(upload_id));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace net
diff --git a/net/url_request/url_request_netlog_params.h b/net/url_request/url_request_netlog_params.h
index f4ca2866..dfb13f4 100644
--- a/net/url_request/url_request_netlog_params.h
+++ b/net/url_request/url_request_netlog_params.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <string>
 
+#include "base/values.h"
 #include "net/base/isolation_info.h"
 #include "net/base/net_export.h"
 #include "net/base/privacy_mode.h"
@@ -20,10 +21,6 @@
 
 class GURL;
 
-namespace base {
-class Value;
-}
-
 namespace url {
 class Origin;
 }
@@ -33,13 +30,13 @@
 class SiteForCookies;
 
 // Returns a Value containing NetLog parameters for constructing a URLRequest.
-NET_EXPORT base::Value NetLogURLRequestConstructorParams(
+NET_EXPORT base::Value::Dict NetLogURLRequestConstructorParams(
     const GURL& url,
     RequestPriority priority,
     NetworkTrafficAnnotationTag traffic_annotation);
 
 // Returns a Value containing NetLog parameters for starting a URLRequest.
-NET_EXPORT base::Value NetLogURLRequestStartParams(
+NET_EXPORT base::Value::Dict NetLogURLRequestStartParams(
     const GURL& url,
     const std::string& method,
     int load_flags,
diff --git a/net/url_request/url_request_throttler_entry.cc b/net/url_request/url_request_throttler_entry.cc
index fa08ce8..7065bc6 100644
--- a/net/url_request/url_request_throttler_entry.cc
+++ b/net/url_request/url_request_throttler_entry.cc
@@ -51,15 +51,16 @@
 const int URLRequestThrottlerEntry::kDefaultEntryLifetimeMs = 2 * 60 * 1000;
 
 // Returns NetLog parameters when a request is rejected by throttling.
-base::Value NetLogRejectedRequestParams(const std::string* url_id,
-                                        int num_failures,
-                                        const base::TimeDelta& release_after) {
+base::Value::Dict NetLogRejectedRequestParams(
+    const std::string* url_id,
+    int num_failures,
+    const base::TimeDelta& release_after) {
   base::Value::Dict dict;
   dict.Set("url", *url_id);
   dict.Set("num_failures", num_failures);
   dict.Set("release_after_ms",
            static_cast<int>(release_after.InMilliseconds()));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 URLRequestThrottlerEntry::URLRequestThrottlerEntry(
diff --git a/net/websockets/websocket_basic_handshake_stream.cc b/net/websockets/websocket_basic_handshake_stream.cc
index 13944903..ee151e03 100644
--- a/net/websockets/websocket_basic_handshake_stream.cc
+++ b/net/websockets/websocket_basic_handshake_stream.cc
@@ -161,11 +161,12 @@
   return true;
 }
 
-base::Value NetLogFailureParam(int net_error, const std::string& message) {
+base::Value::Dict NetLogFailureParam(int net_error,
+                                     const std::string& message) {
   base::Value::Dict dict;
   dict.Set("net_error", net_error);
   dict.Set("message", message);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index ef26145..6a33643 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -106,13 +106,13 @@
   return static_cast<int>(total_size);
 }
 
-base::Value NetLogBufferSizeParam(int buffer_size) {
+base::Value::Dict NetLogBufferSizeParam(int buffer_size) {
   base::Value::Dict dict;
   dict.Set("read_buffer_size_in_bytes", buffer_size);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
-base::Value NetLogFrameHeaderParam(const WebSocketFrameHeader* header) {
+base::Value::Dict NetLogFrameHeaderParam(const WebSocketFrameHeader* header) {
   base::Value::Dict dict;
   dict.Set("final", header->final);
   dict.Set("reserved1", header->reserved1);
@@ -121,7 +121,7 @@
   dict.Set("opcode", header->opcode);
   dict.Set("masked", header->masked);
   dict.Set("payload_length", static_cast<double>(header->payload_length));
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 }  // namespace
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index d63fa32..d3d364a 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -123,14 +123,14 @@
   return;
 }
 
-base::Value NetLogFailParam(uint16_t code,
-                            base::StringPiece reason,
-                            base::StringPiece message) {
+base::Value::Dict NetLogFailParam(uint16_t code,
+                                  base::StringPiece reason,
+                                  base::StringPiece message) {
   base::Value::Dict dict;
   dict.Set("code", code);
   dict.Set("reason", reason);
   dict.Set("internal_reason", message);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 class DependentIOBuffer : public WrappedIOBuffer {
diff --git a/remoting/base/vlog_net_log.cc b/remoting/base/vlog_net_log.cc
index 1e6f060..9c2e7bd 100644
--- a/remoting/base/vlog_net_log.cc
+++ b/remoting/base/vlog_net_log.cc
@@ -43,7 +43,7 @@
 VlogNetLogObserver::~VlogNetLogObserver() = default;
 
 void VlogNetLogObserver::OnAddEntry(const net::NetLogEntry& entry) {
-  base::Value value = entry.ToValue();
+  base::Value::Dict value = entry.ToDict();
   std::string json;
   base::JSONWriter::Write(value, &json);
   VLOG(4) << json;
diff --git a/remoting/host/config_file_watcher_unittest.cc b/remoting/host/config_file_watcher_unittest.cc
index 4565b55..93df5f6 100644
--- a/remoting/host/config_file_watcher_unittest.cc
+++ b/remoting/host/config_file_watcher_unittest.cc
@@ -100,9 +100,7 @@
 // Verifies that the initial notification is delivered.
 TEST_F(ConfigFileWatcherTest, Basic) {
   std::string data("test");
-  EXPECT_NE(base::WriteFile(config_file_, data.c_str(),
-                            static_cast<int>(data.size())),
-            -1);
+  EXPECT_TRUE(base::WriteFile(config_file_, data));
 
   EXPECT_CALL(delegate_, OnConfigUpdated(_))
       .Times(1)
@@ -128,9 +126,7 @@
 
   // Modify the watched file.
   std::string data("test");
-  EXPECT_NE(base::WriteFile(config_file_, data.c_str(),
-                            static_cast<int>(data.size())),
-            -1);
+  EXPECT_TRUE(base::WriteFile(config_file_, data));
 
   run_loop_.Run();
 }
diff --git a/remoting/host/file_transfer/ipc_file_operations_unittest.cc b/remoting/host/file_transfer/ipc_file_operations_unittest.cc
index 9bbe2d5..6eed9a1 100644
--- a/remoting/host/file_transfer/ipc_file_operations_unittest.cc
+++ b/remoting/host/file_transfer/ipc_file_operations_unittest.cc
@@ -460,10 +460,7 @@
   base::FilePath path = TestDir().Append(kTestFilename);
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(path, contents));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
@@ -511,10 +508,7 @@
   base::FilePath path = TestDir().Append(kTestFilename);
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(path, contents));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
@@ -565,7 +559,7 @@
 TEST_F(IpcFileOperationsTest, ReaderHandlesZeroSize) {
   constexpr std::size_t kChunkSize = 5;
   base::FilePath path = TestDir().Append(kTestFilename);
-  ASSERT_EQ(0, base::WriteFile(path, "", 0));
+  ASSERT_TRUE(base::WriteFile(path, ""));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
@@ -610,10 +604,7 @@
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
   for (const auto& path : paths) {
-    ASSERT_EQ(
-        static_cast<int>(contents.size()),
-        base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                        contents.size()));
+    ASSERT_TRUE(base::WriteFile(path, contents));
   }
 
   std::vector<std::unique_ptr<FileOperations::Reader>> readers;
@@ -758,10 +749,7 @@
   // which doesn't conflict with this |read_path|.
   base::FilePath read_path(
       base_path.InsertBeforeExtension(FILE_PATH_LITERAL("(read)")));
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(read_path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(read_path, contents));
 
   // Pending open file operations.
   absl::optional<FileOperations::Writer::Result> open_for_write_result;
@@ -1044,7 +1032,7 @@
 TEST_F(IpcFileOperationsTest, ErrorWhenReadChunkCalledAfterReceiverDisconnect) {
   constexpr std::size_t kChunkSize = 5;
   base::FilePath path = TestDir().Append(kTestFilename);
-  ASSERT_EQ(0, base::WriteFile(path, "", 0));
+  ASSERT_TRUE(base::WriteFile(path, ""));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
diff --git a/remoting/host/file_transfer/local_file_operations_unittest.cc b/remoting/host/file_transfer/local_file_operations_unittest.cc
index 466ff0d..e31fc152 100644
--- a/remoting/host/file_transfer/local_file_operations_unittest.cc
+++ b/remoting/host/file_transfer/local_file_operations_unittest.cc
@@ -234,10 +234,7 @@
   base::FilePath path = TestDir().Append(kTestFilename);
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(path, contents));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
@@ -262,10 +259,7 @@
   base::FilePath path = TestDir().Append(kTestFilename);
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(path, contents));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
@@ -299,10 +293,7 @@
   base::FilePath path = TestDir().Append(kTestFilename);
   std::vector<std::uint8_t> contents =
       ByteArrayFrom(kTestDataOne, kTestDataTwo, kTestDataThree);
-  ASSERT_EQ(
-      static_cast<int>(contents.size()),
-      base::WriteFile(path, reinterpret_cast<const char*>(contents.data()),
-                      contents.size()));
+  ASSERT_TRUE(base::WriteFile(path, contents));
 
   std::unique_ptr<FileOperations::Reader> reader =
       file_operations_->CreateReader();
diff --git a/remoting/host/host_config_unittest.cc b/remoting/host/host_config_unittest.cc
index 347cbe50..28abffad 100644
--- a/remoting/host/host_config_unittest.cc
+++ b/remoting/host/host_config_unittest.cc
@@ -35,7 +35,7 @@
   HostConfigTest() = default;
 
   static void WriteTestFile(const base::FilePath& filename) {
-    base::WriteFile(filename, kTestConfig, std::strlen(kTestConfig));
+    base::WriteFile(filename, kTestConfig);
   }
 
   // The temporary directory used to contain the test operations.
diff --git a/remoting/host/linux/certificate_watcher_unittest.cc b/remoting/host/linux/certificate_watcher_unittest.cc
index 14b1b99e..e38c8cf 100644
--- a/remoting/host/linux/certificate_watcher_unittest.cc
+++ b/remoting/host/linux/certificate_watcher_unittest.cc
@@ -87,9 +87,7 @@
     if (base::PathExists(path)) {
       EXPECT_TRUE(base::AppendToFile(path, testWriteString));
     } else {
-      EXPECT_EQ(static_cast<int>(testWriteString.length()),
-                base::WriteFile(path, testWriteString.c_str(),
-                                testWriteString.length()));
+      ASSERT_TRUE(base::WriteFile(path, testWriteString));
     }
   }
 
diff --git a/remoting/host/mac/host_service_main.cc b/remoting/host/mac/host_service_main.cc
index 4090e35d..50f5f3d5 100644
--- a/remoting/host/mac/host_service_main.cc
+++ b/remoting/host/mac/host_service_main.cc
@@ -274,7 +274,7 @@
     HOST_LOG << "Message from chmod: " << output;
   }
 
-  if (base::WriteFile(enabled_file_, nullptr, 0) < 0) {
+  if (!base::WriteFile(enabled_file_, base::StringPiece())) {
     LOG(ERROR) << "Failed to write enabled file";
     return false;
   }
@@ -286,8 +286,7 @@
   std::istreambuf_iterator<char> begin(std::cin);
   std::istreambuf_iterator<char> end;
   std::string config(begin, end);
-  if (base::WriteFile(config_file_, config.data(), config.size()) !=
-      static_cast<int>(config.size())) {
+  if (!base::WriteFile(config_file_, config)) {
     LOG(ERROR) << "Failed to write config file";
     return false;
   }
diff --git a/remoting/test/video_frame_writer.cc b/remoting/test/video_frame_writer.cc
index 350b2bbd..c527b75 100644
--- a/remoting/test/video_frame_writer.cc
+++ b/remoting/test/video_frame_writer.cc
@@ -54,10 +54,7 @@
   }
 
   // Dump contents (unsigned chars) to a file as a sequence of chars.
-  int write_bytes = base::WriteFile(
-      image_path, reinterpret_cast<char*>(&*png_encoded_data.begin()),
-      static_cast<int>(png_encoded_data.size()));
-  if (write_bytes != static_cast<int>(png_encoded_data.size())) {
+  if (!base::WriteFile(image_path, png_encoded_data)) {
     LOG(WARNING) << "Failed to write frame to disk";
   }
 }
diff --git a/sandbox/policy/features.cc b/sandbox/policy/features.cc
index b060d9d..d9c6354 100644
--- a/sandbox/policy/features.cc
+++ b/sandbox/policy/features.cc
@@ -51,6 +51,11 @@
              "RendererFilterEnvironment",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Emergency "off switch" for removal of direct system font access from
+// sandboxed processes.
+BASE_FEATURE(kWinSboxAllowSystemFonts,
+             "WinSboxAllowSystemFonts",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/sandbox/policy/features.h b/sandbox/policy/features.h
index bcdc703..f187b14 100644
--- a/sandbox/policy/features.h
+++ b/sandbox/policy/features.h
@@ -26,6 +26,7 @@
 SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kRendererAppContainer);
 SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kSharedSandboxPolicies);
 SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kRendererFilterEnvironment);
+SANDBOX_POLICY_EXPORT BASE_DECLARE_FEATURE(kWinSboxAllowSystemFonts);
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc
index fe039418..3aeae83 100644
--- a/sandbox/policy/win/sandbox_win.cc
+++ b/sandbox/policy/win/sandbox_win.cc
@@ -676,11 +676,14 @@
   }
 
 #if !defined(NACL_WIN64)
-  if (process_type == switches::kRendererProcess ||
-      process_type == switches::kPpapiPluginProcess ||
-      sandbox_type == Sandbox::kPrintCompositor) {
-    AddDirectory(base::DIR_WINDOWS_FONTS, NULL, true,
-                 Semantics::kFilesAllowReadonly, config);
+  if (base::FeatureList::IsEnabled(
+          sandbox::policy::features::kWinSboxAllowSystemFonts)) {
+    if (process_type == switches::kRendererProcess ||
+        process_type == switches::kPpapiPluginProcess ||
+        sandbox_type == Sandbox::kPrintCompositor) {
+      AddDirectory(base::DIR_WINDOWS_FONTS, NULL, true,
+                   Semantics::kFilesAllowReadonly, config);
+    }
   }
 #endif
 
diff --git a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
index 3e3d2ad..3b1f98a 100644
--- a/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
+++ b/services/device/generic_sensor/platform_sensor_and_provider_unittest_linux.cc
@@ -64,8 +64,7 @@
 
 void WriteValueToFile(const base::FilePath& path, double value) {
   const std::string str = base::NumberToString(value);
-  int bytes_written = base::WriteFile(path, str.data(), str.size());
-  EXPECT_EQ(static_cast<size_t>(bytes_written), str.size());
+  EXPECT_TRUE(base::WriteFile(path, str));
 }
 
 std::string ReadValueFromFile(const base::FilePath& path,
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc
index 09f4217..d31c267 100644
--- a/services/network/cors/cors_url_loader.cc
+++ b/services/network/cors/cors_url_loader.cc
@@ -85,12 +85,13 @@
   return absl::nullopt;
 }
 
-base::Value NetLogCorsURLLoaderStartParams(const ResourceRequest& request) {
-  base::Value dict(base::Value::Type::DICT);
-  dict.SetStringKey("url", request.url.possibly_invalid_spec());
-  dict.SetStringKey("method", request.method);
-  dict.SetStringKey("headers", request.headers.ToString());
-  dict.SetBoolKey("is_revalidating", request.is_revalidating);
+base::Value::Dict NetLogCorsURLLoaderStartParams(
+    const ResourceRequest& request) {
+  base::Value::Dict dict;
+  dict.Set("url", request.url.possibly_invalid_spec());
+  dict.Set("method", request.method);
+  dict.Set("headers", request.headers.ToString());
+  dict.Set("is_revalidating", request.is_revalidating);
   std::string cors_preflight_policy;
   switch (request.cors_preflight_policy) {
     case mojom::CorsPreflightPolicy::kConsiderPreflight:
@@ -100,14 +101,14 @@
       cors_preflight_policy = "prevent_preflight";
       break;
   }
-  dict.SetStringKey("cors_preflight_policy", cors_preflight_policy);
+  dict.Set("cors_preflight_policy", cors_preflight_policy);
   return dict;
 }
 
-base::Value NetLogPreflightRequiredParams(
+base::Value::Dict NetLogPreflightRequiredParams(
     absl::optional<PreflightRequiredReason> preflight_required_reason) {
-  base::Value dict(base::Value::Type::DICT);
-  dict.SetBoolKey("preflight_required", preflight_required_reason.has_value());
+  base::Value::Dict dict;
+  dict.Set("preflight_required", preflight_required_reason.has_value());
   if (preflight_required_reason) {
     std::string preflight_required_reason_param;
     switch (preflight_required_reason.value()) {
@@ -124,8 +125,7 @@
         preflight_required_reason_param = "disallowed_header";
         break;
     }
-    dict.SetStringKey("preflight_required_reason",
-                      preflight_required_reason_param);
+    dict.Set("preflight_required_reason", preflight_required_reason_param);
   }
   return dict;
 }
@@ -814,7 +814,7 @@
   }
 
   net_log_.AddEvent(net::NetLogEventType::CORS_PREFLIGHT_ERROR, [&] {
-    return base::Value(NetLogPreflightErrorParams(net_error, status));
+    return NetLogPreflightErrorParams(net_error, status);
   });
 
   // `kInvalidResponse` is never returned by the preflight controller, so we use
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc
index 55caf33..b43e0b9 100644
--- a/services/network/cors/cors_url_loader_unittest.cc
+++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -931,13 +931,11 @@
 
   const net::NetLogEntry* entry =
       FindEntryByType(entries, net::NetLogEventType::CORS_PREFLIGHT_ERROR);
-  const base::Value::Dict* params = entry->params.GetIfDict();
-  ASSERT_TRUE(params);
-  EXPECT_THAT(params->FindString("error"), Pointee(Eq("ERR_FAILED")));
-  EXPECT_THAT(params->FindInt("cors-error"),
+  EXPECT_THAT(entry->params.FindString("error"), Pointee(Eq("ERR_FAILED")));
+  EXPECT_THAT(entry->params.FindInt("cors-error"),
               Optional(Eq(static_cast<int>(
                   mojom::CorsError::kPreflightDisallowedRedirect))));
-  EXPECT_THAT(params->FindString("failed-parameter"), IsNull());
+  EXPECT_THAT(entry->params.FindString("failed-parameter"), IsNull());
 }
 
 TEST_F(CorsURLLoaderTest, RedirectInfoShouldBeUsed) {
@@ -2258,13 +2256,11 @@
 
   const net::NetLogEntry* entry =
       FindEntryByType(entries, net::NetLogEventType::CORS_PREFLIGHT_ERROR);
-  const base::Value::Dict* params = entry->params.GetIfDict();
-  ASSERT_TRUE(params);
-  EXPECT_THAT(params->FindString("error"), Pointee(Eq("ERR_FAILED")));
-  EXPECT_THAT(params->FindInt("cors-error"),
+  EXPECT_THAT(entry->params.FindString("error"), Pointee(Eq("ERR_FAILED")));
+  EXPECT_THAT(entry->params.FindInt("cors-error"),
               Optional(Eq(static_cast<int>(
                   mojom::CorsError::kPreflightMissingAllowOriginHeader))));
-  EXPECT_THAT(params->FindString("failed-parameter"), IsNull());
+  EXPECT_THAT(entry->params.FindString("failed-parameter"), IsNull());
 }
 
 TEST_F(CorsURLLoaderTest, NetLogPreflightMethodDisallowed) {
@@ -2296,19 +2292,15 @@
 
   const net::NetLogEntry* entry =
       FindEntryByType(entries, net::NetLogEventType::CORS_PREFLIGHT_RESULT);
-  ASSERT_EQ(entry->params.type(), base::Value::Type::DICT);
-  EXPECT_THAT(
-      entry->params.GetDict().FindString("access-control-allow-methods"),
-      Pointee(Eq("GET")));
+  EXPECT_THAT(entry->params.FindString("access-control-allow-methods"),
+              Pointee(Eq("GET")));
 
   entry = FindEntryByType(entries, net::NetLogEventType::CORS_PREFLIGHT_ERROR);
-  const base::Value::Dict* params = entry->params.GetIfDict();
-  ASSERT_TRUE(params);
-  EXPECT_THAT(params->FindString("error"), Pointee(Eq("ERR_FAILED")));
-  EXPECT_THAT(params->FindInt("cors-error"),
+  EXPECT_THAT(entry->params.FindString("error"), Pointee(Eq("ERR_FAILED")));
+  EXPECT_THAT(entry->params.FindInt("cors-error"),
               Optional(Eq(static_cast<int>(
                   mojom::CorsError::kMethodDisallowedByPreflightResponse))));
-  EXPECT_THAT(params->FindString("failed-parameter"), Pointee(Eq("PUT")));
+  EXPECT_THAT(entry->params.FindString("failed-parameter"), Pointee(Eq("PUT")));
 }
 
 TEST_F(CorsURLLoaderTest, NetLogPreflightNetError) {
@@ -2331,10 +2323,10 @@
   ASSERT_THAT(GetTypesOfNetLogEntries(entries), Contains(type).Times(1));
 
   const net::NetLogEntry* entry = FindEntryByType(entries, type);
-  const base::Value::Dict* params = entry->params.GetIfDict();
-  EXPECT_THAT(params->FindString("error"), Pointee(Eq("ERR_INVALID_ARGUMENT")));
-  EXPECT_THAT(params->FindInt("cors-error"), Eq(absl::nullopt));
-  EXPECT_THAT(params->FindString("failed-parameter"), IsNull());
+  EXPECT_THAT(entry->params.FindString("error"),
+              Pointee(Eq("ERR_INVALID_ARGUMENT")));
+  EXPECT_THAT(entry->params.FindInt("cors-error"), Eq(absl::nullopt));
+  EXPECT_THAT(entry->params.FindString("failed-parameter"), IsNull());
 }
 
 TEST_F(CorsURLLoaderTest, PreflightMissingAllowOrigin) {
diff --git a/services/network/cors/preflight_cache.cc b/services/network/cors/preflight_cache.cc
index 1780461a2..c9f890d 100644
--- a/services/network/cors/preflight_cache.cc
+++ b/services/network/cors/preflight_cache.cc
@@ -34,8 +34,8 @@
   kMaxValue = kStale,
 };
 
-base::Value NetLogCacheStatusParams(const CacheMetric metric) {
-  base::Value dict(base::Value::Type::DICT);
+base::Value::Dict NetLogCacheStatusParams(const CacheMetric metric) {
+  base::Value::Dict dict;
   std::string cache_status;
   switch (metric) {
     case CacheMetric::kHitAndPass:
@@ -51,7 +51,7 @@
       cache_status = "stale";
       break;
   }
-  dict.SetStringKey("status", cache_status);
+  dict.Set("status", cache_status);
   return dict;
 }
 
diff --git a/services/network/cors/preflight_result.cc b/services/network/cors/preflight_result.cc
index fed07ce..0b13c50f 100644
--- a/services/network/cors/preflight_result.cc
+++ b/services/network/cors/preflight_result.cc
@@ -287,10 +287,10 @@
          !headers_.contains(kAuthorization);
 }
 
-base::Value PreflightResult::NetLogParams() const {
-  base::Value dict(base::Value::Type::DICT);
-  dict.SetStringKey("access-control-allow-methods", JoinSet(methods_));
-  dict.SetStringKey("access-control-allow-headers", JoinSet(headers_));
+base::Value::Dict PreflightResult::NetLogParams() const {
+  base::Value::Dict dict;
+  dict.Set("access-control-allow-methods", JoinSet(methods_));
+  dict.Set("access-control-allow-headers", JoinSet(headers_));
   return dict;
 }
 
diff --git a/services/network/cors/preflight_result.h b/services/network/cors/preflight_result.h
index d4dba1e..a3adfbd 100644
--- a/services/network/cors/preflight_result.h
+++ b/services/network/cors/preflight_result.h
@@ -12,6 +12,7 @@
 #include "base/containers/flat_set.h"
 #include "base/time/time.h"
 #include "base/types/strong_alias.h"
+#include "base/values.h"
 #include "services/network/public/cpp/cors/cors_error_status.h"
 #include "services/network/public/mojom/cors.mojom-shared.h"
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
@@ -19,7 +20,6 @@
 
 namespace base {
 class TickClock;
-class Value;
 }  // namespace base
 
 namespace net {
@@ -103,7 +103,7 @@
 
   // Returns params for the `CORS_PREFLIGHT_RESULT` and
   // `CORS_PREFLIGHT_CACHED_RESULT` net log events.
-  base::Value NetLogParams() const;
+  base::Value::Dict NetLogParams() const;
 
  protected:
   explicit PreflightResult(const mojom::CredentialsMode credentials_mode);
diff --git a/services/network/cors/preflight_result_unittest.cc b/services/network/cors/preflight_result_unittest.cc
index 8ab7a16..cec1e86 100644
--- a/services/network/cors/preflight_result_unittest.cc
+++ b/services/network/cors/preflight_result_unittest.cc
@@ -651,7 +651,7 @@
         mojom::CredentialsMode::kOmit, test.allow_methods, test.allow_headers,
         absl::nullopt, nullptr);
     ASSERT_TRUE(result);
-    base::Value::Dict dict = result->NetLogParams().TakeDict();
+    base::Value::Dict dict = result->NetLogParams();
     EXPECT_EQ(CHECK_DEREF(dict.FindString("access-control-allow-methods")),
               test.expected_methods);
     EXPECT_EQ(CHECK_DEREF(dict.FindString("access-control-allow-headers")),
diff --git a/services/network/net_log_exporter.cc b/services/network/net_log_exporter.cc
index 5642bc95..fda0066 100644
--- a/services/network/net_log_exporter.cc
+++ b/services/network/net_log_exporter.cc
@@ -172,17 +172,16 @@
 
   base::Value::Dict constants = net::GetNetConstants();
   constants.Merge(std::move(extra_constants));
-  std::unique_ptr<base::Value> constants_value =
-      std::make_unique<base::Value>(std::move(constants));
 
   if (max_file_size != kUnlimitedFileSize) {
     file_net_observer_ = net::FileNetLogObserver::CreateBoundedPreExisting(
         scratch_dir_path, std::move(destination_), max_file_size, capture_mode,
-        std::move(constants_value));
+        std::make_unique<base::Value::Dict>(std::move(constants)));
   } else {
     DCHECK(scratch_dir_path.empty());
     file_net_observer_ = net::FileNetLogObserver::CreateUnboundedPreExisting(
-        std::move(destination_), capture_mode, std::move(constants_value));
+        std::move(destination_), capture_mode,
+        std::make_unique<base::Value::Dict>(std::move(constants)));
   }
 
   // There might not be a NetworkService object e.g. on iOS; in that case
diff --git a/services/network/net_log_proxy_sink.cc b/services/network/net_log_proxy_sink.cc
index 6e83c07b..7f51010 100644
--- a/services/network/net_log_proxy_sink.cc
+++ b/services/network/net_log_proxy_sink.cc
@@ -55,7 +55,7 @@
                                base::TimeTicks source_start_time,
                                net::NetLogEventPhase phase,
                                base::TimeTicks time,
-                               base::Value params) {
+                               base::Value::Dict params) {
   // Note: There is a possible race condition, where the NetLog capture mode
   // changes, but the other process is still sending events for the old capture
   // mode, and thus might log events with a higher than expected capture mode.
diff --git a/services/network/net_log_proxy_sink.h b/services/network/net_log_proxy_sink.h
index 4426d3f..b6c17d9 100644
--- a/services/network/net_log_proxy_sink.h
+++ b/services/network/net_log_proxy_sink.h
@@ -48,7 +48,7 @@
                 base::TimeTicks source_start_time,
                 net::NetLogEventPhase phase,
                 base::TimeTicks time,
-                base::Value params) override;
+                base::Value::Dict params) override;
 
  private:
   mojo::RemoteSet<network::mojom::NetLogProxySource> proxy_source_remotes_;
diff --git a/services/network/net_log_proxy_sink_unittest.cc b/services/network/net_log_proxy_sink_unittest.cc
index 7ebe0f14..52db6f0 100644
--- a/services/network/net_log_proxy_sink_unittest.cc
+++ b/services/network/net_log_proxy_sink_unittest.cc
@@ -110,8 +110,8 @@
       base::TimeTicks() + base::Milliseconds(10);
   base::TimeTicks source1_event0_time =
       source1_start_time + base::Milliseconds(1);
-  base::Value source1_event0_params(base::Value::Type::DICT);
-  source1_event0_params.SetStringKey("hello", "world");
+  base::Value::Dict source1_event0_params;
+  source1_event0_params.Set("hello", "world");
   proxy_sink_remote->AddEntry(
       static_cast<uint32_t>(net::NetLogEventType::REQUEST_ALIVE),
       static_cast<uint32_t>(net::NetLogSourceType::URL_REQUEST), 1U,
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index adc7c63..d55b9615 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -4178,8 +4178,6 @@
   ASSERT_EQ(1u, factory->resolvers().size());
   net::ContextHostResolver* internal_resolver = factory->resolvers().front();
 
-  EXPECT_TRUE(internal_resolver->GetDnsConfigAsValue().is_dict());
-
   // Override DnsClient with a basic mock.
   net::DnsConfig base_configuration;
   base_configuration.nameservers = {CreateExpectedEndPoint("12.12.12.12", 53)};
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 9ac831f..a7b8c2b 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -566,7 +566,7 @@
 
   file_net_log_observer_ = net::FileNetLogObserver::CreateUnboundedPreExisting(
       std::move(file), capture_mode,
-      std::make_unique<base::Value>(std::move(constants)));
+      std::make_unique<base::Value::Dict>(std::move(constants)));
   file_net_log_observer_->StartObserving(net_log_);
 }
 
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 640b3de..756587b 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -615,8 +615,6 @@
       /*insecure_dns_client_enabled=*/false, net::SecureDnsMode::kAutomatic,
       kConfig1,
       /*additional_dns_types_enabled=*/true);
-  EXPECT_TRUE(
-      service()->host_resolver_manager()->GetDnsConfigAsValue().is_dict());
   EXPECT_EQ(kConfig1, dns_client_ptr->GetEffectiveConfig()->doh_config);
 
   // Enable DNS over HTTPS for two servers.
@@ -625,8 +623,6 @@
       /*insecure_dns_client_enabled=*/true, net::SecureDnsMode::kSecure,
       kConfig2,
       /*additional_dns_types_enabled=*/true);
-  EXPECT_TRUE(
-      service()->host_resolver_manager()->GetDnsConfigAsValue().is_dict());
   EXPECT_EQ(kConfig2, dns_client_ptr->GetEffectiveConfig()->doh_config);
 }
 
diff --git a/services/network/oblivious_http_request_handler.cc b/services/network/oblivious_http_request_handler.cc
index 7aef094..9eecbafa 100644
--- a/services/network/oblivious_http_request_handler.cc
+++ b/services/network/oblivious_http_request_handler.cc
@@ -292,7 +292,7 @@
           dict.Set("bytes", net::NetLogBinaryValue(bhttp_payload.data(),
                                                    bhttp_payload.size()));
         }
-        return base::Value(std::move(dict));
+        return dict;
       });
 
   // Padding
@@ -408,7 +408,7 @@
           dict.Set("bytes", net::NetLogBinaryValue(maybe_payload->data(),
                                                    maybe_payload->size()));
         }
-        return base::Value(std::move(dict));
+        return dict;
       });
 
   auto bhttp_response = quiche::BinaryHttpResponse::Create(*maybe_payload);
diff --git a/services/network/proxy_resolver_factory_mojo.cc b/services/network/proxy_resolver_factory_mojo.cc
index ac0b8b69..3abc92c5 100644
--- a/services/network/proxy_resolver_factory_mojo.cc
+++ b/services/network/proxy_resolver_factory_mojo.cc
@@ -49,11 +49,12 @@
 
 namespace {
 
-base::Value NetLogErrorParams(int line_number, const std::string& message) {
+base::Value::Dict NetLogErrorParams(int line_number,
+                                    const std::string& message) {
   base::Value::Dict dict;
   dict.Set("line_number", line_number);
   dict.Set("message", message);
-  return base::Value(std::move(dict));
+  return dict;
 }
 
 // A mixin that forwards logging to (Bound)NetLog and ProxyResolverErrorObserver
diff --git a/services/network/proxy_resolver_factory_mojo_unittest.cc b/services/network/proxy_resolver_factory_mojo_unittest.cc
index 22d07285..c5feda7 100644
--- a/services/network/proxy_resolver_factory_mojo_unittest.cc
+++ b/services/network/proxy_resolver_factory_mojo_unittest.cc
@@ -501,7 +501,7 @@
   EXPECT_EQ(net::NetLogEventType::PAC_JAVASCRIPT_ALERT, entries[0].type);
   EXPECT_EQ(expected_string,
             net::GetStringValueFromParams(entries[0], "message"));
-  ASSERT_FALSE(entries[0].params.GetDict().contains("line_number"));
+  ASSERT_FALSE(entries[0].params.contains("line_number"));
   EXPECT_EQ(net::NetLogEventType::PAC_JAVASCRIPT_ERROR, entries[1].type);
   EXPECT_EQ(expected_string,
             net::GetStringValueFromParams(entries[1], "message"));
diff --git a/services/network/proxy_service_mojo_unittest.cc b/services/network/proxy_service_mojo_unittest.cc
index 74353fd..8711e15 100644
--- a/services/network/proxy_service_mojo_unittest.cc
+++ b/services/network/proxy_service_mojo_unittest.cc
@@ -100,7 +100,7 @@
   }
   ASSERT_LT(i, entries.size());
   EXPECT_EQ("alert: foo", net::GetStringValueFromParams(entries[i], "message"));
-  ASSERT_FALSE(entries[i].params.GetDict().contains("line_number"));
+  ASSERT_FALSE(entries[i].params.contains("line_number"));
 
   while (i < entries.size() &&
          entries[i].type != net::NetLogEventType::PAC_JAVASCRIPT_ERROR) {
diff --git a/services/network/public/mojom/net_log.mojom b/services/network/public/mojom/net_log.mojom
index fed9a8d..1b4530e2 100644
--- a/services/network/public/mojom/net_log.mojom
+++ b/services/network/public/mojom/net_log.mojom
@@ -79,5 +79,6 @@
   AddEntry(/*NetLogEventType*/ uint32 type,
            /*NetLogSourceType*/ uint32 source_type, uint32 source_id,
            mojo_base.mojom.TimeTicks source_start_time, NetLogEventPhase phase,
-           mojo_base.mojom.TimeTicks time, mojo_base.mojom.Value params);
+           mojo_base.mojom.TimeTicks time,
+           mojo_base.mojom.DictionaryValue params);
 };
diff --git a/services/network/session_cleanup_cookie_store.cc b/services/network/session_cleanup_cookie_store.cc
index 6a2d1511..a390042 100644
--- a/services/network/session_cleanup_cookie_store.cc
+++ b/services/network/session_cleanup_cookie_store.cc
@@ -25,14 +25,15 @@
 
 namespace {
 
-base::Value CookieStoreOriginFiltered(const std::string& origin,
-                                      bool is_https,
-                                      net::NetLogCaptureMode capture_mode) {
+base::Value::Dict CookieStoreOriginFiltered(
+    const std::string& origin,
+    bool is_https,
+    net::NetLogCaptureMode capture_mode) {
   if (!net::NetLogCaptureIncludesSensitive(capture_mode))
-    return base::Value();
-  base::Value dict(base::Value::Type::DICT);
-  dict.SetStringKey("origin", origin);
-  dict.SetBoolKey("is_https", is_https);
+    return base::Value::Dict();
+  base::Value::Dict dict;
+  dict.Set("origin", origin);
+  dict.Set("is_https", is_https);
   return dict;
 }
 
diff --git a/services/network/trust_tokens/trust_token_request_helper_factory.cc b/services/network/trust_tokens/trust_token_request_helper_factory.cc
index c0d617bd1..84156a8 100644
--- a/services/network/trust_tokens/trust_token_request_helper_factory.cc
+++ b/services/network/trust_tokens/trust_token_request_helper_factory.cc
@@ -65,8 +65,8 @@
       outcome);
   log.EndEvent(net::NetLogEventType::TRUST_TOKEN_OPERATION_REQUESTED,
                [outcome]() {
-                 base::Value ret(base::Value::Type::DICT);
-                 ret.SetStringKey("outcome", OutcomeToString(outcome));
+                 base::Value::Dict ret;
+                 ret.Set("outcome", OutcomeToString(outcome));
                  return ret;
                });
 }
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.cc b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
index 93817548..f6146a2 100644
--- a/services/network/trust_tokens/trust_token_request_issuance_helper.cc
+++ b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
@@ -69,9 +69,9 @@
   return {std::move(cryptographer), std::move(unblinded_tokens)};
 }
 
-base::Value CreateLogValue(base::StringPiece outcome) {
-  base::Value ret(base::Value::Type::DICT);
-  ret.SetStringKey("outcome", outcome);
+base::Value::Dict CreateLogValue(base::StringPiece outcome) {
+  base::Value::Dict ret;
+  ret.Set("outcome", outcome);
   return ret;
 }
 
@@ -320,8 +320,8 @@
   net_log_.EndEvent(
       net::NetLogEventType::TRUST_TOKEN_OPERATION_FINALIZE_ISSUANCE,
       [num_obtained_tokens = *num_obtained_tokens_]() {
-        base::Value ret = CreateLogValue("Success");
-        ret.SetIntKey("# tokens obtained", num_obtained_tokens);
+        base::Value::Dict ret = CreateLogValue("Success");
+        ret.Set("# tokens obtained", static_cast<int>(num_obtained_tokens));
         return ret;
       });
   std::move(done).Run(mojom::TrustTokenOperationStatus::kOk);
diff --git a/services/network/trust_tokens/trust_token_request_redemption_helper.cc b/services/network/trust_tokens/trust_token_request_redemption_helper.cc
index f5e27a50..77eba037 100644
--- a/services/network/trust_tokens/trust_token_request_redemption_helper.cc
+++ b/services/network/trust_tokens/trust_token_request_redemption_helper.cc
@@ -27,9 +27,9 @@
 
 namespace {
 
-base::Value CreateLogValue(base::StringPiece outcome) {
-  base::Value ret(base::Value::Type::DICT);
-  ret.SetStringKey("outcome", outcome);
+base::Value::Dict CreateLogValue(base::StringPiece outcome) {
+  base::Value::Dict ret;
+  ret.Set("outcome", outcome);
   return ret;
 }
 
diff --git a/services/network/trust_tokens/trust_token_request_signing_helper.cc b/services/network/trust_tokens/trust_token_request_signing_helper.cc
index 433786e..7b12e8f 100644
--- a/services/network/trust_tokens/trust_token_request_signing_helper.cc
+++ b/services/network/trust_tokens/trust_token_request_signing_helper.cc
@@ -42,8 +42,8 @@
 void LogOutcome(const net::NetLogWithSource& log, base::StringPiece outcome) {
   log.EndEvent(net::NetLogEventType::TRUST_TOKEN_OPERATION_BEGIN_SIGNING,
                [outcome]() {
-                 base::Value ret(base::Value::Type::DICT);
-                 ret.SetStringKey("outcome", outcome);
+                 base::Value::Dict ret;
+                 ret.Set("outcome", outcome);
                  return ret;
                });
 }
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 7cf2c3a4..eda5f4e 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -1177,15 +1177,14 @@
 
   url_request_->net_log().AddEvent(
       net::NetLogEventType::PRIVATE_NETWORK_ACCESS_CHECK, [&] {
-        base::Value dict(base::Value::Type::DICT);
-        dict.SetStringKey(
-            "client_address_space",
-            IPAddressSpaceToStringPiece(
-                private_network_access_checker_.ClientAddressSpace()));
-        dict.SetStringKey("resource_address_space",
-                          IPAddressSpaceToStringPiece(response_address_space));
-        dict.SetStringKey("result",
-                          PrivateNetworkAccessCheckResultToStringPiece(result));
+        base::Value::Dict dict;
+        dict.Set("client_address_space",
+                 IPAddressSpaceToStringPiece(
+                     private_network_access_checker_.ClientAddressSpace()));
+        dict.Set("resource_address_space",
+                 IPAddressSpaceToStringPiece(response_address_space));
+        dict.Set("result",
+                 PrivateNetworkAccessCheckResultToStringPiece(result));
         return dict;
       });
 
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index ac6ec34e..9bb8ae96 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -1946,16 +1946,14 @@
 
   ASSERT_THAT(entries, SizeIs(1));
 
-  const base::Value& params = entries[0].params;
-  ASSERT_EQ(params.type(), base::Value::Type::DICT);
+  const base::Value::Dict& params = entries[0].params;
 
-  EXPECT_THAT(params.GetDict().FindString("client_address_space"),
+  EXPECT_THAT(params.FindString("client_address_space"), Pointee(Eq("local")));
+
+  EXPECT_THAT(params.FindString("resource_address_space"),
               Pointee(Eq("local")));
 
-  EXPECT_THAT(params.GetDict().FindString("resource_address_space"),
-              Pointee(Eq("local")));
-
-  EXPECT_THAT(params.GetDict().FindString("result"),
+  EXPECT_THAT(params.FindString("result"),
               Pointee(Eq("allowed-no-less-public")));
 }
 
@@ -1975,16 +1973,14 @@
 
   ASSERT_THAT(entries, SizeIs(1));
 
-  const base::Value& params = entries[0].params;
-  ASSERT_EQ(params.type(), base::Value::Type::DICT);
+  const base::Value::Dict params = std::move(entries[0].params);
 
-  EXPECT_THAT(params.GetDict().FindString("client_address_space"),
-              Pointee(Eq("public")));
+  EXPECT_THAT(params.FindString("client_address_space"), Pointee(Eq("public")));
 
-  EXPECT_THAT(params.GetDict().FindString("resource_address_space"),
+  EXPECT_THAT(params.FindString("resource_address_space"),
               Pointee(Eq("local")));
 
-  EXPECT_THAT(params.GetDict().FindString("result"),
+  EXPECT_THAT(params.FindString("result"),
               Pointee(Eq("blocked-by-policy-preflight-block")));
 }
 
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h
index 5070b79..1a1754b 100644
--- a/services/tracing/perfetto/privacy_filtered_fields-inl.h
+++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -364,6 +364,11 @@
 constexpr int kProcessSingletonIndices[] = {1, 2, -1};
 constexpr MessageInfo kProcessSingleton = {kProcessSingletonIndices, nullptr};
 
+// Proto Message: ScrollDeltas
+constexpr int kScrollDeltasIndices[] = {1, 2,  3,  4,  5,  6,  7, 8,
+                                        9, 10, 11, 12, 13, 14, -1};
+constexpr MessageInfo kScrollDeltas = {kScrollDeltasIndices, nullptr};
+
 // Proto Message: AndroidIPC
 constexpr int kAndroidIPCIndices[] = {1, 2, -1};
 constexpr MessageInfo kAndroidIPC = {kAndroidIPCIndices, nullptr};
@@ -387,14 +392,20 @@
 constexpr int kActiveProcessesIndices[] = {1, -1};
 constexpr MessageInfo kActiveProcesses = {kActiveProcessesIndices, nullptr};
 
+// Proto Message: TabSwitchMeasurement
+constexpr int kTabSwitchMeasurementIndices[] = {1, 2, 3, -1};
+constexpr MessageInfo kTabSwitchMeasurement = {kTabSwitchMeasurementIndices,
+                                               nullptr};
+
 // Proto Message: TrackEvent
 constexpr int kTrackEventIndices[] = {
-    1,    2,    3,    5,    6,    9,    10,   11,   12,   16,   17,   22,
-    23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,
-    35,   36,   38,   39,   40,   41,   42,   43,   47,   48,   1001, 1002,
-    1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014,
-    1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1028,
-    1031, 1032, 1033, 1034, 1036, 1038, 1039, 1040, 1041, 1042, -1};
+    1,    2,    3,    5,    6,    9,    10,   11,   12,   16,   17,
+    22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,
+    33,   34,   35,   36,   38,   39,   40,   41,   42,   43,   47,
+    48,   1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010,
+    1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021,
+    1022, 1023, 1024, 1025, 1028, 1031, 1032, 1033, 1034, 1036, 1037,
+    1038, 1039, 1040, 1041, 1042, 1046, -1};
 constexpr MessageInfo const* kTrackEventComplexMessages[] = {
     nullptr,
     nullptr,
@@ -461,11 +472,13 @@
     &kProcessSingleton,
     &kSiteInstanceGroup,
     nullptr,
+    &kScrollDeltas,
     &kAndroidIPC,
     &kChromeSqlDiagnostics,
     &kSequenceManagerTask,
     &kAndroidToolbar,
-    &kActiveProcesses};
+    &kActiveProcesses,
+    &kTabSwitchMeasurement};
 constexpr MessageInfo kTrackEvent = {kTrackEventIndices,
                                      kTrackEventComplexMessages};
 
diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
index 71d79e7..b8037d39 100644
--- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
+++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
@@ -57,6 +57,7 @@
 struct FrameCountingPerSinkData {
   CompositorFrameSinkType type;
   bool is_root;
+  string debug_label;
 
   // Bucket index of the first bucket in `presented_frames` based on the
   // timestamp of the first presented frame in the bucket and start time.
diff --git a/skia/ext/image_operations_unittest.cc b/skia/ext/image_operations_unittest.cc
index 64947f2..b3a1ef50 100644
--- a/skia/ext/image_operations_unittest.cc
+++ b/skia/ext/image_operations_unittest.cc
@@ -176,10 +176,7 @@
   }
 
   const base::FilePath fpath(path);
-  const int num_written =
-      base::WriteFile(fpath, reinterpret_cast<const char*>(&png[0]),
-                           png.size());
-  if (num_written != static_cast<int>(png.size())) {
+  if (!base::WriteFile(fpath, png)) {
     FAIL() << "Failed to write dest \"" << path << '"';
   }
 }
diff --git a/storage/browser/blob/blob_transport_strategy_unittest.cc b/storage/browser/blob/blob_transport_strategy_unittest.cc
index cbc207c..41867d8 100644
--- a/storage/browser/blob/blob_transport_strategy_unittest.cc
+++ b/storage/browser/blob/blob_transport_strategy_unittest.cc
@@ -370,6 +370,14 @@
   BlobDataBuilder builder(kId);
 
   base::RunLoop loop;
+  std::string data = base::RandBytesAsString(kTestBlobStorageMaxFileSizeBytes);
+  blink::mojom::DataElementBytes bytes(data.size(), absl::nullopt,
+                                       mojo::NullRemote());
+
+  // Must outlive `strategy`.
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider(
+      CreateBytesProvider(data, absl::nullopt));
+
   BlobStatus status = BlobStatus::PENDING_TRANSPORT;
   auto strategy = BlobTransportStrategy::Create(
       MemoryStrategy::FILE, &builder,
@@ -382,11 +390,6 @@
           &status, loop.QuitClosure()),
       limits_);
 
-  std::string data = base::RandBytesAsString(kTestBlobStorageMaxFileSizeBytes);
-  blink::mojom::DataElementBytes bytes(data.size(), absl::nullopt,
-                                       mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider(
-      CreateBytesProvider(data, absl::nullopt));
   strategy->AddBytesElement(&bytes, bytes_provider);
 
   FileInfoVector files(1);
@@ -414,6 +417,15 @@
   BlobDataBuilder expected(kId);
 
   base::RunLoop loop;
+  std::string data =
+      base::RandBytesAsString(kTestBlobStorageMaxBlobMemorySize + 42);
+  blink::mojom::DataElementBytes bytes(data.size(), absl::nullopt,
+                                       mojo::NullRemote());
+
+  // Must outlive `strategy`.
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider(
+      CreateBytesProvider(data, mock_time_));
+
   BlobStatus status = BlobStatus::PENDING_TRANSPORT;
   auto strategy = BlobTransportStrategy::Create(
       MemoryStrategy::FILE, &builder,
@@ -426,12 +438,6 @@
           &status, loop.QuitClosure()),
       limits_);
 
-  std::string data =
-      base::RandBytesAsString(kTestBlobStorageMaxBlobMemorySize + 42);
-  blink::mojom::DataElementBytes bytes(data.size(), absl::nullopt,
-                                       mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider(
-      CreateBytesProvider(data, mock_time_));
   strategy->AddBytesElement(&bytes, bytes_provider);
 
   size_t expected_file_count =
@@ -470,6 +476,27 @@
   BlobDataBuilder expected(kId);
 
   base::RunLoop loop;
+  std::string data =
+      base::RandBytesAsString(kTestBlobStorageMaxBlobMemorySize / 3);
+
+  // These must outlive `strategy`.
+  blink::mojom::DataElementBytes bytes1(data.size(), absl::nullopt,
+                                        mojo::NullRemote());
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider1(
+      CreateBytesProvider(data, mock_time_));
+  blink::mojom::DataElementBytes bytes2(data.size(), absl::nullopt,
+                                        mojo::NullRemote());
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider2(
+      CreateBytesProvider(data, mock_time_));
+  blink::mojom::DataElementBytes bytes3(data.size(), absl::nullopt,
+                                        mojo::NullRemote());
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider3(
+      CreateBytesProvider(data, mock_time_));
+  blink::mojom::DataElementBytes bytes4(data.size(), absl::nullopt,
+                                        mojo::NullRemote());
+  mojo::Remote<blink::mojom::BytesProvider> bytes_provider4(
+      CreateBytesProvider(data, mock_time_));
+
   BlobStatus status = BlobStatus::PENDING_TRANSPORT;
   auto strategy = BlobTransportStrategy::Create(
       MemoryStrategy::FILE, &builder,
@@ -481,29 +508,9 @@
           },
           &status, loop.QuitClosure()),
       limits_);
-
-  std::string data =
-      base::RandBytesAsString(kTestBlobStorageMaxBlobMemorySize / 3);
-
-  blink::mojom::DataElementBytes bytes1(data.size(), absl::nullopt,
-                                        mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider1(
-      CreateBytesProvider(data, mock_time_));
   strategy->AddBytesElement(&bytes1, bytes_provider1);
-  blink::mojom::DataElementBytes bytes2(data.size(), absl::nullopt,
-                                        mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider2(
-      CreateBytesProvider(data, mock_time_));
   strategy->AddBytesElement(&bytes2, bytes_provider2);
-  blink::mojom::DataElementBytes bytes3(data.size(), absl::nullopt,
-                                        mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider3(
-      CreateBytesProvider(data, mock_time_));
   strategy->AddBytesElement(&bytes3, bytes_provider3);
-  blink::mojom::DataElementBytes bytes4(data.size(), absl::nullopt,
-                                        mojo::NullRemote());
-  mojo::Remote<blink::mojom::BytesProvider> bytes_provider4(
-      CreateBytesProvider(data, mock_time_));
   strategy->AddBytesElement(&bytes4, bytes_provider4);
 
   size_t expected_file_count =
diff --git a/storage/browser/database/database_quota_client_unittest.cc b/storage/browser/database/database_quota_client_unittest.cc
index 28920f8..522f2c2 100644
--- a/storage/browser/database/database_quota_client_unittest.cc
+++ b/storage/browser/database/database_quota_client_unittest.cc
@@ -188,7 +188,7 @@
         storage_key, name, type, base::SequencedTaskRunner::GetCurrentDefault(),
         bucket_future.GetCallback());
     auto bucket = bucket_future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/storage/browser/file_system/file_system_context.cc b/storage/browser/file_system/file_system_context.cc
index 918cd77..560c400 100644
--- a/storage/browser/file_system/file_system_context.cc
+++ b/storage/browser/file_system/file_system_context.cc
@@ -445,7 +445,7 @@
     if (!bucket->id) {
       // This branch can be hit if the bucket has been deleted but `BucketHost`
       // is still alive.
-      std::move(got_bucket).Run(QuotaError::kUnknownError);
+      std::move(got_bucket).Run(base::unexpected(QuotaError::kUnknownError));
     } else {
       quota_manager_proxy()->GetBucketById(bucket->id, io_task_runner_.get(),
                                            std::move(got_bucket));
@@ -466,7 +466,7 @@
     OpenFileSystemMode mode,
     OpenFileSystemCallback callback,
     QuotaErrorOr<BucketInfo> result) {
-  if (!result.ok()) {
+  if (!result.has_value()) {
     std::move(callback).Run(FileSystemURL(), std::string(),
                             base::File::FILE_ERROR_FAILED);
     return;
diff --git a/storage/browser/file_system/file_system_context_unittest.cc b/storage/browser/file_system/file_system_context_unittest.cc
index 9d8b85e..cff9bfe 100644
--- a/storage/browser/file_system/file_system_context_unittest.cc
+++ b/storage/browser/file_system/file_system_context_unittest.cc
@@ -221,7 +221,7 @@
       base::SequencedTaskRunner::GetCurrentDefault(),
       bucket_future.GetCallback());
   auto bucket = bucket_future.Take();
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   ASSERT_FALSE(last_resolved_url_.has_value());
 
   file_system_context->ResolveURLOnOpenFileSystemForTesting(
diff --git a/storage/browser/file_system/file_system_quota_client_unittest.cc b/storage/browser/file_system/file_system_quota_client_unittest.cc
index fcac4d6..a4b7dc3 100644
--- a/storage/browser/file_system/file_system_quota_client_unittest.cc
+++ b/storage/browser/file_system/file_system_quota_client_unittest.cc
@@ -215,7 +215,7 @@
         {blink::StorageKey::CreateFromStringForTesting(origin), name}, type,
         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
@@ -227,7 +227,7 @@
         blink::StorageKey::CreateFromStringForTesting(origin), name, type,
         future.GetCallback());
     auto bucket = future.Take();
-    EXPECT_TRUE(bucket.ok());
+    EXPECT_TRUE(bucket.has_value());
     return bucket->ToBucketLocator();
   }
 
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc
index f2b5dffd..65e2a84 100644
--- a/storage/browser/file_system/obfuscated_file_util.cc
+++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -1120,8 +1120,9 @@
           GetOrCreateDefaultBucket(storage_key);
       // If there is no default bucket for a given StorageKey, there is not a
       // valid FileSystem to close, so we return.
-      if (!default_bucket.ok())
+      if (!default_bucket.has_value()) {
         return;
+      }
       key_prefix =
           DatabaseKey(storage_key, default_bucket.value(), type_string);
     }
@@ -1181,14 +1182,15 @@
   // Instead of crashing, return a QuotaError if the proxy is a nullptr.
   if (!sandbox_delegate_->quota_manager_proxy()) {
     LOG(WARNING) << "Failed to GetOrCreateBucket: QuotaManagerProxy is null";
-    return QuotaError::kUnknownError;
+    return base::unexpected(QuotaError::kUnknownError);
   }
   // Retrieve or create the default bucket for this StorageKey.
   QuotaErrorOr<BucketInfo> bucket =
       sandbox_delegate_->quota_manager_proxy()->GetOrCreateBucketSync(
           BucketInitParams::ForDefaultBucket(storage_key));
-  if (!bucket.ok())
-    return bucket.error();
+  if (!bucket.has_value()) {
+    return base::unexpected(bucket.error());
+  }
   default_buckets_[storage_key] = bucket->ToBucketLocator();
   return bucket->ToBucketLocator();
 }
@@ -1383,8 +1385,9 @@
       // bucket corresponding to the url's StorageKey.
       QuotaErrorOr<BucketLocator> default_bucket =
           GetOrCreateDefaultBucket(url.storage_key());
-      if (!default_bucket.ok())
+      if (!default_bucket.has_value()) {
         return nullptr;
+      }
       key = DatabaseKey(url.storage_key(), default_bucket.value(), type_string);
     }
   } else {  // All other storage types.
@@ -1417,8 +1420,9 @@
   if (storage_key.IsThirdPartyContext()) {
     // Retrieve the default bucket value for `storage_key`.
     QuotaErrorOr<BucketLocator> bucket = GetOrCreateDefaultBucket(storage_key);
-    if (!bucket.ok())
+    if (!bucket.has_value()) {
       return base::unexpected(base::File::FILE_ERROR_FAILED);
+    }
     // Get the path and verify it is valid.
     base::FileErrorOr<base::FilePath> path =
         sandbox_delegate_->quota_manager_proxy()->GetClientBucketPath(
diff --git a/storage/browser/file_system/obfuscated_file_util_unittest.cc b/storage/browser/file_system/obfuscated_file_util_unittest.cc
index 31ed40f..d7a163f 100644
--- a/storage/browser/file_system/obfuscated_file_util_unittest.cc
+++ b/storage/browser/file_system/obfuscated_file_util_unittest.cc
@@ -270,7 +270,7 @@
         base::SequencedTaskRunner::GetCurrentDefault(),
         default_future.GetCallback());
     QuotaErrorOr<BucketInfo> default_bucket = default_future.Take();
-    CHECK(default_bucket.ok());
+    CHECK(default_bucket.has_value());
     default_bucket_ = default_bucket.value().ToBucketLocator();
 
     // Create a non-default bucket member corresponding to the StorageKey
@@ -282,7 +282,7 @@
         params, base::SequencedTaskRunner::GetCurrentDefault(),
         custom_future.GetCallback());
     QuotaErrorOr<BucketInfo> custom_bucket = custom_future.Take();
-    CHECK(custom_bucket.ok());
+    CHECK(custom_bucket.has_value());
     custom_bucket_ = custom_bucket.value().ToBucketLocator();
 
     // Create an alternate non-default bucket member corresponding to the
@@ -293,7 +293,7 @@
         params, base::SequencedTaskRunner::GetCurrentDefault(),
         alternate_future.GetCallback());
     QuotaErrorOr<BucketInfo> alternate_bucket = alternate_future.Take();
-    CHECK(alternate_bucket.ok());
+    CHECK(alternate_bucket.has_value());
     alternate_custom_bucket_ = alternate_bucket.value().ToBucketLocator();
 
     is_non_default_bucket()
diff --git a/storage/browser/file_system/sandbox_file_stream_writer_unittest.cc b/storage/browser/file_system/sandbox_file_stream_writer_unittest.cc
index 583664a..8cfafa3f 100644
--- a/storage/browser/file_system/sandbox_file_stream_writer_unittest.cc
+++ b/storage/browser/file_system/sandbox_file_stream_writer_unittest.cc
@@ -200,7 +200,7 @@
     QuotaErrorOr<BucketInfo> result = quota_manager_proxy_sync.GetBucket(
         blink::StorageKey::CreateFromStringForTesting(kURLOrigin),
         kDefaultBucketName, blink::mojom::StorageType::kTemporary);
-    EXPECT_TRUE(result.ok());
+    EXPECT_TRUE(result.has_value());
     EXPECT_EQ(result->name, kDefaultBucketName);
     EXPECT_EQ(result->storage_key,
               blink::StorageKey::CreateFromStringForTesting(kURLOrigin));
diff --git a/storage/browser/file_system/sandbox_file_system_backend_unittest.cc b/storage/browser/file_system/sandbox_file_system_backend_unittest.cc
index 8113c70..353c5a68 100644
--- a/storage/browser/file_system/sandbox_file_system_backend_unittest.cc
+++ b/storage/browser/file_system/sandbox_file_system_backend_unittest.cc
@@ -150,7 +150,7 @@
         params, base::SequencedTaskRunner::GetCurrentDefault(),
         custom_future.GetCallback());
     QuotaErrorOr<BucketInfo> custom_bucket = custom_future.Take();
-    CHECK(custom_bucket.ok());
+    CHECK(custom_bucket.has_value());
     return custom_bucket.value().ToBucketLocator();
   }
 
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc
index 66949d5..01dec754 100644
--- a/storage/browser/quota/quota_database.cc
+++ b/storage/browser/quota/quota_database.cc
@@ -130,14 +130,14 @@
 
 QuotaErrorOr<BucketInfo> BucketInfoFromSqlStatement(sql::Statement& statement) {
   if (!statement.Step()) {
-    return statement.Succeeded() ? QuotaError::kNotFound
-                                 : QuotaError::kDatabaseError;
+    return base::unexpected(statement.Succeeded() ? QuotaError::kNotFound
+                                                  : QuotaError::kDatabaseError);
   }
 
   absl::optional<StorageKey> storage_key =
       StorageKey::Deserialize(statement.ColumnString(1));
   if (!storage_key.has_value()) {
-    return QuotaError::kNotFound;
+    return base::unexpected(QuotaError::kNotFound);
   }
 
   return BucketInfo(
@@ -151,7 +151,7 @@
 std::set<BucketInfo> BucketInfosFromSqlStatement(sql::Statement& statement) {
   std::set<BucketInfo> result;
   QuotaErrorOr<BucketInfo> bucket;
-  while ((bucket = BucketInfoFromSqlStatement(statement)).ok()) {
+  while ((bucket = BucketInfoFromSqlStatement(statement)).has_value()) {
     result.insert(bucket.value());
   }
 
@@ -227,7 +227,7 @@
   QuotaErrorOr<BucketInfo> bucket_result =
       GetBucket(params.storage_key, params.name, StorageType::kTemporary);
 
-  if (!bucket_result.ok()) {
+  if (!bucket_result.has_value()) {
     if (bucket_result.error() == QuotaError::kNotFound) {
       return CreateBucketInternal(params, StorageType::kTemporary,
                                   max_bucket_count);
@@ -249,14 +249,14 @@
     bucket_result =
         UpdateBucketExpiration(bucket_result->id, params.expiration);
   }
-  DCHECK(bucket_result.ok());
+  DCHECK(bucket_result.has_value());
 
   if (params.persistent && (*params.persistent != bucket_result->persistent)) {
     DCHECK(!bucket_result->is_default());
     bucket_result =
         UpdateBucketPersistence(bucket_result->id, *params.persistent);
   }
-  DCHECK(bucket_result.ok());
+  DCHECK(bucket_result.has_value());
 
   return bucket_result;
 }
@@ -269,12 +269,12 @@
   QuotaErrorOr<BucketInfo> bucket_result =
       GetBucket(params.storage_key, params.name, type);
 
-  if (bucket_result.ok()) {
+  if (bucket_result.has_value()) {
     return bucket_result;
   }
 
   if (bucket_result.error() != QuotaError::kNotFound) {
-    return bucket_result.error();
+    return base::unexpected(bucket_result.error());
   }
 
   return CreateBucketInternal(params, type);
@@ -297,7 +297,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -320,7 +320,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -344,7 +344,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -366,7 +366,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -386,7 +386,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -407,7 +407,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -429,7 +429,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -561,7 +561,7 @@
   DCHECK(!bucket_id.is_null());
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -574,14 +574,14 @@
   statement.BindInt64(0, bucket_id.value());
 
   if (!statement.Step()) {
-    return statement.Succeeded() ? QuotaError::kNotFound
-                                 : QuotaError::kDatabaseError;
+    return base::unexpected(statement.Succeeded() ? QuotaError::kNotFound
+                                                  : QuotaError::kDatabaseError);
   }
 
   absl::optional<StorageKey> storage_key =
       StorageKey::Deserialize(statement.ColumnString(1));
   if (!storage_key.has_value()) {
-    return QuotaError::kNotFound;
+    return base::unexpected(QuotaError::kNotFound);
   }
 
   mojom::BucketTableEntryPtr entry =
@@ -594,14 +594,14 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   // Doom bucket directory first so data is no longer accessible, even if
   // directory deletion fails. `storage_directory_` may be nullptr for
   // in-memory only.
   if (storage_directory_ && !storage_directory_->DoomBucket(bucket)) {
-    return QuotaError::kFileOperationError;
+    return base::unexpected(QuotaError::kFileOperationError);
   }
 
   static constexpr char kSql[] =
@@ -611,7 +611,7 @@
   statement.BindInt64(0, bucket.id.value());
 
   if (!statement.Step()) {
-    return QuotaError::kDatabaseError;
+    return base::unexpected(QuotaError::kDatabaseError);
   }
 
   // Scheduling this commit introduces the chance of inconsistencies
@@ -641,7 +641,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   // clang-format off
@@ -675,7 +675,7 @@
     return BucketLocator(read_bucket_id, std::move(read_storage_key).value(),
                          type, statement.ColumnString(2) == kDefaultBucketName);
   }
-  return QuotaError::kNotFound;
+  return base::unexpected(QuotaError::kNotFound);
 }
 
 QuotaErrorOr<std::set<StorageKey>> QuotaDatabase::GetStorageKeysForType(
@@ -683,7 +683,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   static constexpr char kSql[] =
@@ -711,7 +711,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   DCHECK(!begin.is_max());
@@ -745,7 +745,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   // clang-format off
@@ -1176,7 +1176,7 @@
   // TODO(crbug/1210259): Add DCHECKs for input validation.
   QuotaError open_error = EnsureOpened();
   if (open_error != QuotaError::kNone) {
-    return open_error;
+    return base::unexpected(open_error);
   }
 
   // First verify this won't exceed the max bucket count if one is given.
@@ -1197,12 +1197,12 @@
     statement.BindInt(1, static_cast<int>(type));
 
     if (!statement.Step()) {
-      return QuotaError::kDatabaseError;
+      return base::unexpected(QuotaError::kDatabaseError);
     }
 
     const int64_t current_bucket_count = statement.ColumnInt64(0);
     if (current_bucket_count >= max_bucket_count) {
-      return QuotaError::kQuotaExceeded;
+      return base::unexpected(QuotaError::kQuotaExceeded);
     }
   }
 
@@ -1220,7 +1220,7 @@
   const bool done = !statement.Step();
   DCHECK(done);
 
-  if (result.ok()) {
+  if (result.has_value()) {
     // Commit immediately so that we persist the bucket metadata to disk before
     // we inform other services / web apps (via the Buckets API) that we did so.
     // Once informed, that promise should persist across power failures.
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc
index 44c6fbe..2a7adc0 100644
--- a/storage/browser/quota/quota_database_unittest.cc
+++ b/storage/browser/quota/quota_database_unittest.cc
@@ -200,7 +200,7 @@
       "google_bucket");
 
   QuotaErrorOr<BucketInfo> result = db->UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo created_bucket = result.value();
   ASSERT_GT(created_bucket.id.value(), 0);
@@ -210,7 +210,7 @@
 
   // Should return the same bucket when querying again.
   result = db->UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo retrieved_bucket = result.value();
   ASSERT_EQ(retrieved_bucket.id, created_bucket.id);
@@ -223,12 +223,12 @@
       StorageKey::CreateFromStringForTesting("http://google/"),
       "google_bucket2");
   result = db->UpdateOrCreateBucket(params2, 1);
-  ASSERT_FALSE(result.ok());
+  ASSERT_FALSE(result.has_value());
   EXPECT_EQ(QuotaError::kQuotaExceeded, result.error());
 
   // It doesn't affect the update case.
   result = db->UpdateOrCreateBucket(params, 1);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 }
 
 TEST_P(QuotaDatabaseTest, UpdateBucket) {
@@ -241,7 +241,7 @@
   params.persistent = true;
 
   QuotaErrorOr<BucketInfo> result = db->UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   BucketInfo created_bucket = result.value();
 
   EXPECT_EQ(params.expiration, result->expiration);
@@ -253,7 +253,7 @@
   params.quota = 1024 * 1024 * 20;  // 20 MB
   params.durability = blink::mojom::BucketDurability::kStrict;
   result = db->UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   BucketInfo updated_bucket = result.value();
 
   EXPECT_EQ(updated_bucket.id, created_bucket.id);
@@ -278,7 +278,7 @@
   params.expiration = base::Time();
   params.persistent.reset();
   result = db->UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   // Expiration and persistence are unchanged.
   EXPECT_EQ(result->expiration, updated_bucket.expiration);
@@ -293,7 +293,7 @@
 
   QuotaErrorOr<BucketInfo> result =
       db->GetOrCreateBucketDeprecated({storage_key, kDefaultBucketName}, kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo created_bucket = result.value();
   ASSERT_GT(created_bucket.id.value(), 0);
@@ -304,7 +304,7 @@
   // Should return the same bucket when querying again.
   result =
       db->GetOrCreateBucketDeprecated({storage_key, kDefaultBucketName}, kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo retrieved_bucket = result.value();
   ASSERT_EQ(retrieved_bucket.id, created_bucket.id);
@@ -323,7 +323,7 @@
   std::string bucket_name = "google_bucket";
   QuotaErrorOr<BucketInfo> result =
       db->CreateBucketForTesting(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo created_bucket = result.value();
   ASSERT_GT(created_bucket.id.value(), 0);
@@ -332,7 +332,7 @@
   ASSERT_EQ(created_bucket.type, kTemp);
 
   result = db->GetBucket(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(result.value().id, created_bucket.id);
   EXPECT_EQ(result.value().name, created_bucket.name);
   EXPECT_EQ(result.value().storage_key, created_bucket.storage_key);
@@ -340,14 +340,14 @@
 
   // Can't retrieve buckets with name mismatch.
   result = db->GetBucket(storage_key, "does_not_exist", kTemp);
-  ASSERT_FALSE(result.ok());
+  ASSERT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 
   // Can't retrieve buckets with StorageKey mismatch.
   result =
       db->GetBucket(StorageKey::CreateFromStringForTesting("http://example/"),
                     bucket_name, kTemp);
-  ASSERT_FALSE(result.ok());
+  ASSERT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 }
 
@@ -361,7 +361,7 @@
   std::string bucket_name = "google_bucket";
   QuotaErrorOr<BucketInfo> result =
       db->CreateBucketForTesting(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
 
   BucketInfo created_bucket = result.value();
   ASSERT_GT(created_bucket.id.value(), 0);
@@ -370,14 +370,14 @@
   ASSERT_EQ(created_bucket.type, kTemp);
 
   result = db->GetBucketById(created_bucket.id);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(result.value().name, created_bucket.name);
   EXPECT_EQ(result.value().storage_key, created_bucket.storage_key);
   ASSERT_EQ(result.value().type, created_bucket.type);
 
   constexpr BucketId kNonExistentBucketId(7777);
   result = db->GetBucketById(BucketId(kNonExistentBucketId));
-  ASSERT_FALSE(result.ok());
+  ASSERT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 }
 
@@ -394,33 +394,33 @@
 
   QuotaErrorOr<BucketInfo> bucket_result =
       db->CreateBucketForTesting(storage_key1, "temp_bucket", kTemp);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo temp_bucket1 = bucket_result.value();
 
   bucket_result =
       db->CreateBucketForTesting(storage_key2, "temp_bucket", kTemp);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo temp_bucket2 = bucket_result.value();
 
   bucket_result =
       db->CreateBucketForTesting(storage_key1, kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo sync_bucket1 = bucket_result.value();
 
   bucket_result =
       db->CreateBucketForTesting(storage_key3, kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo sync_bucket2 = bucket_result.value();
 
   QuotaErrorOr<std::set<BucketInfo>> result = db->GetBucketsForType(kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   std::set<BucketLocator> buckets = BucketInfosToBucketLocators(result.value());
   ASSERT_EQ(2U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, temp_bucket1));
   EXPECT_TRUE(ContainsBucket(buckets, temp_bucket2));
 
   result = db->GetBucketsForType(kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   buckets = BucketInfosToBucketLocators(result.value());
   ASSERT_EQ(2U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, sync_bucket1));
@@ -446,22 +446,22 @@
 
   QuotaErrorOr<std::set<BucketInfo>> result =
       db->GetBucketsForHost("example.com", kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_EQ(result->size(), 2U);
   EXPECT_TRUE(base::Contains(result.value(), temp_example_bucket1.value()));
   EXPECT_TRUE(base::Contains(result.value(), temp_example_bucket2.value()));
 
   result = db->GetBucketsForHost("example.com", kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_EQ(result->size(), 0U);
 
   result = db->GetBucketsForHost("google.com", kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_EQ(result->size(), 1U);
   EXPECT_TRUE(base::Contains(result.value(), perm_google_bucket1.value()));
 
   result = db->GetBucketsForHost("google.com", kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_EQ(result->size(), 1U);
   EXPECT_TRUE(base::Contains(result.value(), temp_google_bucket2.value()));
 }
@@ -477,33 +477,33 @@
 
   QuotaErrorOr<BucketInfo> bucket_result =
       db->CreateBucketForTesting(storage_key1, "temp_test1", kTemp);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo temp_bucket1 = bucket_result.value();
 
   bucket_result = db->CreateBucketForTesting(storage_key1, "temp_test2", kTemp);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo temp_bucket2 = bucket_result.value();
 
   bucket_result =
       db->CreateBucketForTesting(storage_key1, kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo sync_bucket1 = bucket_result.value();
 
   bucket_result =
       db->CreateBucketForTesting(storage_key2, kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
   BucketInfo sync_bucket2 = bucket_result.value();
 
   QuotaErrorOr<std::set<BucketInfo>> result =
       db->GetBucketsForStorageKey(storage_key1, kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   std::set<BucketLocator> buckets = BucketInfosToBucketLocators(result.value());
   ASSERT_EQ(2U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, temp_bucket1));
   EXPECT_TRUE(ContainsBucket(buckets, temp_bucket2));
 
   result = db->GetBucketsForStorageKey(storage_key2, kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   buckets = BucketInfosToBucketLocators(result.value());
   ASSERT_EQ(1U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, sync_bucket2));
@@ -516,7 +516,7 @@
   std::set<BucketId> bucket_exceptions;
   QuotaErrorOr<BucketLocator> result =
       db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_FALSE(result.ok());
+  EXPECT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 
   // Insert bucket entries into BucketTable.
@@ -574,7 +574,7 @@
       QuotaError::kNone);
 
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id1, result.value().id);
 
   // Test that unlimited origins are excluded from eviction, but
@@ -583,29 +583,29 @@
   policy->AddUnlimited(storage_key1.origin().GetURL());
   policy->AddProtected(storage_key2.origin().GetURL());
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, policy.get());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id2, result.value().id);
 
   // Test that durable origins are excluded from eviction.
   policy->AddDurable(storage_key2.origin().GetURL());
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, policy.get());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id3, result.value().id);
 
   // Bucket exceptions exclude specified buckets.
   bucket_exceptions.insert(bucket_id1);
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id2, result.value().id);
 
   bucket_exceptions.insert(bucket_id2);
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id3, result.value().id);
 
   bucket_exceptions.insert(bucket_id3);
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_FALSE(result.ok());
+  EXPECT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 
   EXPECT_EQ(db->SetBucketLastAccessTime(bucket_id1, base::Time::Now()),
@@ -618,19 +618,19 @@
 
   // Delete storage_key/type last access time information.
   auto deleted = db->DeleteBucketData(bucket_locator);
-  ASSERT_TRUE(deleted.ok());
+  ASSERT_TRUE(deleted.has_value());
   EXPECT_EQ(bucket_id3, BucketId::FromUnsafeValue(deleted.value()->bucket_id));
 
   // Querying again to see if the deletion has worked.
   bucket_exceptions.clear();
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id2, result.value().id);
 
   bucket_exceptions.insert(bucket_id1);
   bucket_exceptions.insert(bucket_id2);
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_FALSE(result.ok());
+  EXPECT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 }
 
@@ -641,7 +641,7 @@
   std::set<BucketId> bucket_exceptions;
   QuotaErrorOr<BucketLocator> result =
       db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_FALSE(result.ok());
+  EXPECT_FALSE(result.has_value());
   EXPECT_EQ(result.error(), QuotaError::kNotFound);
 
   // Insert bucket entries into BucketTable.
@@ -673,12 +673,12 @@
       QuotaError::kNone);
 
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id1, result.value().id);
 
-  ASSERT_TRUE(db->UpdateBucketPersistence(bucket_id1, true).ok());
+  ASSERT_TRUE(db->UpdateBucketPersistence(bucket_id1, true).has_value());
   result = db->GetLruEvictableBucket(kTemp, bucket_exceptions, nullptr);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_EQ(bucket_id2, result.value().id);
 }
 
@@ -702,7 +702,7 @@
 
   QuotaErrorOr<mojom::BucketTableEntryPtr> info =
       db->GetBucketInfoForTest(bucket->id);
-  EXPECT_TRUE(info.ok());
+  EXPECT_TRUE(info.has_value());
   EXPECT_EQ(now, info.value()->last_accessed);
   EXPECT_EQ(1, info.value()->use_count);
 }
@@ -718,19 +718,21 @@
   const StorageKey storage_key3 =
       StorageKey::CreateFromStringForTesting("http://example-c/");
 
-  db->CreateBucketForTesting(storage_key1, "bucket_a", kTemp);
-  db->CreateBucketForTesting(storage_key2, "bucket_b", kTemp);
-  db->CreateBucketForTesting(storage_key2, kDefaultBucketName, kSync);
-  db->CreateBucketForTesting(storage_key3, kDefaultBucketName, kSync);
+  std::ignore = db->CreateBucketForTesting(storage_key1, "bucket_a", kTemp);
+  std::ignore = db->CreateBucketForTesting(storage_key2, "bucket_b", kTemp);
+  std::ignore =
+      db->CreateBucketForTesting(storage_key2, kDefaultBucketName, kSync);
+  std::ignore =
+      db->CreateBucketForTesting(storage_key3, kDefaultBucketName, kSync);
 
   QuotaErrorOr<std::set<StorageKey>> result = db->GetStorageKeysForType(kTemp);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_TRUE(base::Contains(result.value(), storage_key1));
   ASSERT_TRUE(base::Contains(result.value(), storage_key2));
   ASSERT_FALSE(base::Contains(result.value(), storage_key3));
 
   result = db->GetStorageKeysForType(kSync);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   ASSERT_FALSE(base::Contains(result.value(), storage_key1));
   ASSERT_TRUE(base::Contains(result.value(), storage_key2));
   ASSERT_TRUE(base::Contains(result.value(), storage_key3));
@@ -742,29 +744,29 @@
 
   QuotaErrorOr<std::set<BucketLocator>> result =
       db->GetBucketsModifiedBetween(kTemp, base::Time(), base::Time::Max());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   std::set<BucketLocator> buckets = result.value();
   EXPECT_TRUE(buckets.empty());
 
   QuotaErrorOr<BucketInfo> result1 = db->CreateBucketForTesting(
       StorageKey::CreateFromStringForTesting("http://example-a/"), "bucket_a",
       kTemp);
-  EXPECT_TRUE(result1.ok());
+  EXPECT_TRUE(result1.has_value());
   BucketInfo bucket1 = result1.value();
   QuotaErrorOr<BucketInfo> result2 = db->CreateBucketForTesting(
       StorageKey::CreateFromStringForTesting("http://example-b/"), "bucket_b",
       kTemp);
-  EXPECT_TRUE(result2.ok());
+  EXPECT_TRUE(result2.has_value());
   BucketInfo bucket2 = result2.value();
   QuotaErrorOr<BucketInfo> result3 = db->CreateBucketForTesting(
       StorageKey::CreateFromStringForTesting("http://example-c/"), "bucket_c",
       kTemp);
-  EXPECT_TRUE(result3.ok());
+  EXPECT_TRUE(result3.has_value());
   BucketInfo bucket3 = result3.value();
   QuotaErrorOr<BucketInfo> result4 = db->CreateBucketForTesting(
       StorageKey::CreateFromStringForTesting("http://example-d/"),
       kDefaultBucketName, kSync);
-  EXPECT_TRUE(result4.ok());
+  EXPECT_TRUE(result4.has_value());
   BucketInfo bucket4 = result4.value();
 
   // Report last modified time for the buckets.
@@ -788,7 +790,7 @@
 
   result =
       db->GetBucketsModifiedBetween(kTemp, base::Time(), base::Time::Max());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(3U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, bucket1));
@@ -798,7 +800,7 @@
 
   result = db->GetBucketsModifiedBetween(kTemp, base::Time::FromJavaTime(5),
                                          base::Time::Max());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(2U, buckets.size());
   EXPECT_FALSE(ContainsBucket(buckets, bucket1));
@@ -808,7 +810,7 @@
 
   result = db->GetBucketsModifiedBetween(kTemp, base::Time::FromJavaTime(15),
                                          base::Time::Max());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(1U, buckets.size());
   EXPECT_FALSE(ContainsBucket(buckets, bucket1));
@@ -818,13 +820,13 @@
 
   result = db->GetBucketsModifiedBetween(kTemp, base::Time::FromJavaTime(25),
                                          base::Time::Max());
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_TRUE(buckets.empty());
 
   result = db->GetBucketsModifiedBetween(kTemp, base::Time::FromJavaTime(5),
                                          base::Time::FromJavaTime(15));
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(1U, buckets.size());
   EXPECT_FALSE(ContainsBucket(buckets, bucket1));
@@ -834,7 +836,7 @@
 
   result = db->GetBucketsModifiedBetween(kTemp, base::Time::FromJavaTime(0),
                                          base::Time::FromJavaTime(20));
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(2U, buckets.size());
   EXPECT_TRUE(ContainsBucket(buckets, bucket1));
@@ -844,7 +846,7 @@
 
   result = db->GetBucketsModifiedBetween(kSync, base::Time::FromJavaTime(0),
                                          base::Time::FromJavaTime(35));
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   buckets = result.value();
   EXPECT_EQ(1U, buckets.size());
   EXPECT_FALSE(ContainsBucket(buckets, bucket1));
@@ -873,11 +875,11 @@
   QuotaErrorOr<BucketInfo> bucket_result =
       db->GetBucket(StorageKey::CreateFromStringForTesting("http://a/"),
                     kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket_result.ok());
+  ASSERT_TRUE(bucket_result.has_value());
 
   QuotaErrorOr<mojom::BucketTableEntryPtr> info =
       db->GetBucketInfoForTest(bucket_result->id);
-  EXPECT_TRUE(info.ok());
+  EXPECT_TRUE(info.has_value());
   EXPECT_EQ(0, info.value()->use_count);
 
   EXPECT_EQ(db->SetStorageKeyLastAccessTime(
@@ -885,14 +887,14 @@
                 base::Time::FromDoubleT(1.0)),
             QuotaError::kNone);
   info = db->GetBucketInfoForTest(bucket_result->id);
-  EXPECT_TRUE(info.ok());
+  EXPECT_TRUE(info.has_value());
   EXPECT_EQ(1, info.value()->use_count);
 
   EXPECT_EQ(db->RegisterInitialStorageKeyInfo(storage_keys_by_type),
             QuotaError::kNone);
 
   info = db->GetBucketInfoForTest(bucket_result->id);
-  EXPECT_TRUE(info.ok());
+  EXPECT_TRUE(info.has_value());
   EXPECT_EQ(1, info.value()->use_count);
 }
 
@@ -941,7 +943,7 @@
     EXPECT_TRUE(EnsureOpened(db.get()));
     QuotaErrorOr<BucketInfo> result =
         db->CreateBucketForTesting(storage_key, bucket_name, kTemp);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     BucketLocator bucket = result->ToBucketLocator();
 
     const base::FilePath idb_bucket_path = CreateClientBucketPath(
@@ -957,13 +959,13 @@
     EXPECT_TRUE(EnsureOpened(db.get()));
     QuotaErrorOr<BucketInfo> result =
         db->GetBucket(storage_key, bucket_name, kTemp);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     BucketLocator bucket = result->ToBucketLocator();
 
     const base::FilePath bucket_path = CreateBucketPath(ProfilePath(), bucket);
     ASSERT_TRUE(base::PathExists(bucket_path));
 
-    ASSERT_TRUE(db->DeleteBucketData(bucket).ok());
+    ASSERT_TRUE(db->DeleteBucketData(bucket).has_value());
     ASSERT_FALSE(base::PathExists(bucket_path));
   }
 }
@@ -1026,7 +1028,7 @@
   {
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->UpdateOrCreateBucket(params, 0);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
   }
   // Move db file paths to legacy file path for path migration test setup.
   {
@@ -1038,7 +1040,7 @@
   {
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->GetBucket(params.storage_key, params.name, kTemp);
-    EXPECT_TRUE(result.ok());
+    EXPECT_TRUE(result.has_value());
     EXPECT_FALSE(base::PathExists(kLegacyFilePath));
     EXPECT_TRUE(base::PathExists(DbPath()));
   }
@@ -1055,7 +1057,7 @@
   {
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->UpdateOrCreateBucket(params, 0);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
   }
   // Copy db file paths to legacy file path to mimic bad migration state.
   base::CopyFile(DbPath(), kLegacyFilePath);
@@ -1064,7 +1066,7 @@
   {
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->GetBucket(params.storage_key, params.name, kTemp);
-    EXPECT_TRUE(result.ok());
+    EXPECT_TRUE(result.has_value());
     EXPECT_TRUE(base::PathExists(DbPath()));
   }
 }
@@ -1087,9 +1089,9 @@
     auto db = CreateDatabase(/*is_incognito=*/false);
     // Create two buckets to check that ids are different after database reset.
     auto result = db->UpdateOrCreateBucket(google_params, 0);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     result = db->UpdateOrCreateBucket(example_params, 0);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     example_id = result->id;
   }
   {
@@ -1106,7 +1108,7 @@
     // reset.
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->UpdateOrCreateBucket(example_params, 0);
-    ASSERT_TRUE(result.ok());
+    ASSERT_TRUE(result.has_value());
     // Validate database reset by checking that bucket id doesn't match.
     EXPECT_NE(result->id, example_id);
   }
@@ -1121,7 +1123,8 @@
 
   {
     QuotaErrorOr<BucketInfo> result = db.UpdateOrCreateBucket(params, 0);
-    ASSERT_TRUE(result.ok()) << "Failed to create bucket to be used in test";
+    ASSERT_TRUE(result.has_value())
+        << "Failed to create bucket to be used in test";
   }
 
   // Bucket lookup uses the `buckets_by_storage_key` index.
@@ -1137,7 +1140,7 @@
     base::HistogramTester histograms;
 
     QuotaErrorOr<BucketInfo> result = db.UpdateOrCreateBucket(params, 0);
-    EXPECT_FALSE(result.ok());
+    EXPECT_FALSE(result.has_value());
 
     histograms.ExpectTotalCount("Quota.QuotaDatabaseError", 1);
     histograms.ExpectBucketCount("Quota.QuotaDatabaseError",
@@ -1153,11 +1156,11 @@
       StorageKey::CreateFromStringForTesting("http://google/"),
       "google_bucket");
   QuotaErrorOr<BucketInfo> result = db.UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_TRUE(result->expiration.is_null());
 
   QuotaErrorOr<std::set<BucketInfo>> expired_buckets = db.GetExpiredBuckets();
-  ASSERT_TRUE(expired_buckets.ok());
+  ASSERT_TRUE(expired_buckets.has_value());
   EXPECT_EQ(0U, expired_buckets->size());
 
   // Non-default `expiration` value.
@@ -1166,27 +1169,27 @@
       "example_bucket");
   params2.expiration = base::Time::Now();
   result = db.UpdateOrCreateBucket(params2, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(params2.expiration, result->expiration);
 
   // Update `expiration` value.
   base::Time updated_time = base::Time::Now() + base::Days(1);
   result = db.UpdateBucketExpiration(result->id, updated_time);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(updated_time, result->expiration);
 
   expired_buckets = db.GetExpiredBuckets();
-  ASSERT_TRUE(expired_buckets.ok());
+  ASSERT_TRUE(expired_buckets.has_value());
   EXPECT_EQ(0U, expired_buckets->size());
 
   // Set expiration to the past.
   updated_time = base::Time::Now() - base::Days(1);
   result = db.UpdateBucketExpiration(result->id, updated_time);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(updated_time, result->expiration);
 
   expired_buckets = db.GetExpiredBuckets();
-  ASSERT_TRUE(expired_buckets.ok());
+  ASSERT_TRUE(expired_buckets.has_value());
   EXPECT_EQ(1U, expired_buckets->size());
 }
 
@@ -1198,7 +1201,7 @@
       StorageKey::CreateFromStringForTesting("http://google/"),
       "google_bucket");
   QuotaErrorOr<BucketInfo> result = db.UpdateOrCreateBucket(params, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_FALSE(params.persistent.has_value());
   EXPECT_FALSE(result->persistent);
 
@@ -1208,13 +1211,13 @@
       "example_bucket");
   params2.persistent = !params2.persistent;
   result = db.UpdateOrCreateBucket(params2, 0);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_EQ(params2.persistent, result->persistent);
 
   // Update `persistent` value.
   EXPECT_TRUE(result->persistent);
   result = db.UpdateBucketPersistence(result->id, false);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   EXPECT_FALSE(result->persistent);
 }
 
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc
index 82d56ea4..3029ee8 100644
--- a/storage/browser/quota/quota_manager_impl.cc
+++ b/storage/browser/quota/quota_manager_impl.cc
@@ -643,7 +643,8 @@
   ~BucketDataDeleter() {
     // `callback` is non-null if the deleter gets destroyed before completing.
     if (callback_) {
-      std::move(callback_).Run(this, QuotaError::kUnknownError);
+      std::move(callback_).Run(this,
+                               base::unexpected(QuotaError::kUnknownError));
     }
   }
 
@@ -723,13 +724,14 @@
                          weak_factory_.GetWeakPtr()));
       return;
     }
-    Complete(error_count_ == 0 ? QuotaError::kNone : QuotaError::kUnknownError);
+    Complete(base::unexpected(error_count_ == 0 ? QuotaError::kNone
+                                                : QuotaError::kUnknownError));
   }
 
   void DidDeleteBucketFromDatabase(
       QuotaErrorOr<mojom::BucketTableEntryPtr> result) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    manager_->DidDatabaseWork(result.ok());
+    manager_->DidDatabaseWork(result.has_value());
     Complete(std::move(result));
   }
 
@@ -810,7 +812,7 @@
  private:
   void DidGetBuckets(QuotaErrorOr<std::set<BucketInfo>> result) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    if (!result.ok()) {
+    if (!result.has_value()) {
       Complete(/*success=*/false);
       return;
     }
@@ -848,7 +850,7 @@
     DCHECK(base::Contains(bucket_deleters_, deleter));
     bucket_deleters_.erase(deleter);
 
-    if (!entry.ok()) {
+    if (!entry.has_value()) {
       ++error_count_;
     }
 
@@ -1028,12 +1030,12 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   if (!bucket_params.expiration.is_null() &&
       (bucket_params.expiration <= QuotaDatabase::GetNow())) {
-    std::move(callback).Run(QuotaError::kInvalidExpiration);
+    std::move(callback).Run(base::unexpected(QuotaError::kInvalidExpiration));
     return;
   }
 
@@ -1068,7 +1070,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1093,7 +1095,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1119,7 +1121,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1142,7 +1144,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1185,7 +1187,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1208,7 +1210,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1233,7 +1235,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
 
@@ -1384,7 +1386,7 @@
       [](StatusCallback callback,
          QuotaErrorOr<mojom::BucketTableEntryPtr> result) {
         std::move(callback).Run(
-            (result.ok() || result.error() == QuotaError::kNone)
+            (result.has_value() || result.error() == QuotaError::kNone)
                 ? blink::mojom::QuotaStatusCode::kOk
                 : blink::mojom::QuotaStatusCode::kUnknown);
       },
@@ -1425,7 +1427,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -1449,7 +1451,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   PostTaskAndReplyWithResultForDBThread(
@@ -2048,7 +2050,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
 
@@ -2058,7 +2060,7 @@
              QuotaDatabase* database) {
             DCHECK(database);
             auto result = database->DeleteBucketData(bucket);
-            if (commit_immediately && result.ok()) {
+            if (commit_immediately && result.has_value()) {
               database->CommitNow();
             }
 
@@ -2073,7 +2075,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(io_thread_->BelongsToCurrentThread());
 
-  if (entry.ok()) {
+  if (entry.has_value()) {
     base::Time now = QuotaDatabase::GetNow();
     base::UmaHistogramCounts1M(
         QuotaManagerImpl::kEvictedBucketAccessedCountHistogram,
@@ -2103,7 +2105,7 @@
   EnsureDatabaseOpened();
 
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
   auto bucket_deleter = std::make_unique<BucketDataDeleter>(
@@ -2136,10 +2138,10 @@
     base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback,
     BucketInfo bucket_info,
     QuotaErrorOr<mojom::BucketTableEntryPtr> result) {
-  if (result.ok()) {
+  if (result.has_value()) {
     UpdateOrCreateBucket(params, std::move(callback));
   } else {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
   }
 }
 
@@ -2520,9 +2522,10 @@
 void QuotaManagerImpl::DidGetLruEvictableBucket(
     QuotaErrorOr<BucketLocator> result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
 
-  if (result.ok()) {
+  if (result.has_value()) {
     std::move(lru_bucket_callback_)
         .Run(absl::make_optional(std::move(result.value())));
   } else {
@@ -2709,7 +2712,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
   std::move(callback).Run(std::move(result));
 }
 
@@ -2720,9 +2724,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
 
-  if (result.ok() && !result->expiration.is_null() &&
+  if (result.has_value() && !result->expiration.is_null() &&
       result->expiration <= QuotaDatabase::GetNow()) {
     DeleteBucketDataInternal(
         result->ToBucketLocator(), AllQuotaClientTypes(),
@@ -2741,9 +2746,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
 
-  if (!result.ok()) {
+  if (!result.has_value()) {
     // Return QuotaStatusCode::kOk if bucket not found. No work needed.
     std::move(callback).Run(result.error() == QuotaError::kNotFound
                                 ? blink::mojom::QuotaStatusCode::kOk
@@ -2755,7 +2761,7 @@
       [](StatusCallback callback,
          QuotaErrorOr<mojom::BucketTableEntryPtr> result) {
         std::move(callback).Run(
-            (result.ok() || result.error() == QuotaError::kNone)
+            (result.has_value() || result.error() == QuotaError::kNone)
                 ? blink::mojom::QuotaStatusCode::kOk
                 : blink::mojom::QuotaStatusCode::kUnknown);
       },
@@ -2773,9 +2779,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
 
-  if (!result.ok()) {
+  if (!result.has_value()) {
     std::move(callback).Run();
     return;
   }
@@ -2805,7 +2812,7 @@
 void QuotaManagerImpl::DidGetBucketForUsageAndQuota(
     UsageAndQuotaCallback callback,
     QuotaErrorOr<BucketInfo> result) {
-  if (!result.ok()) {
+  if (!result.has_value()) {
     std::move(callback).Run(blink::mojom::QuotaStatusCode::kUnknown, 0, 0);
     return;
   }
@@ -2824,8 +2831,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
-  if (!result.ok()) {
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
+  if (!result.has_value()) {
     std::move(callback).Run(std::set<StorageKey>());
     return;
   }
@@ -2838,7 +2846,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
   std::move(callback).Run(std::move(result));
 }
 
@@ -2848,9 +2857,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
 
-  if (!result.ok()) {
+  if (!result.has_value()) {
     std::move(callback).Run(std::move(result));
     return;
   }
@@ -2891,8 +2901,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(callback);
 
-  DidDatabaseWork(result.ok() || result.error() != QuotaError::kDatabaseError);
-  if (!result.ok()) {
+  DidDatabaseWork(result.has_value() ||
+                  result.error() != QuotaError::kDatabaseError);
+  if (!result.has_value()) {
     std::move(callback).Run(std::set<BucketLocator>(), type);
     return;
   }
diff --git a/storage/browser/quota/quota_manager_proxy.cc b/storage/browser/quota/quota_manager_proxy.cc
index 5f2fa292..6480f2b 100644
--- a/storage/browser/quota/quota_manager_proxy.cc
+++ b/storage/browser/quota/quota_manager_proxy.cc
@@ -112,7 +112,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -139,7 +139,7 @@
             // than risking deadlock.
             if (!self->quota_manager_impl_ ||
                 self->quota_manager_impl_->is_bootstrapping_database_) {
-              *sync_bucket = QuotaError::kUnknownError;
+              *sync_bucket = base::unexpected(QuotaError::kUnknownError);
               waiter->Signal();
               return;
             }
@@ -181,7 +181,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -212,7 +212,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -243,7 +243,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -274,7 +274,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -302,7 +302,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -361,7 +361,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
@@ -391,7 +391,7 @@
   auto respond =
       base::BindPostTask(std::move(callback_task_runner), std::move(callback));
   if (!quota_manager_impl_) {
-    std::move(respond).Run(QuotaError::kUnknownError);
+    std::move(respond).Run(base::unexpected(QuotaError::kUnknownError));
     return;
   }
 
diff --git a/storage/browser/quota/quota_manager_proxy_unittest.cc b/storage/browser/quota/quota_manager_proxy_unittest.cc
index 7b1a6ef..097d630 100644
--- a/storage/browser/quota/quota_manager_proxy_unittest.cc
+++ b/storage/browser/quota/quota_manager_proxy_unittest.cc
@@ -60,7 +60,7 @@
       params, base::SingleThreadTaskRunner::GetCurrentDefault(),
       future.GetCallback());
   auto bucket = future.Take();
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
 
   base::FilePath expected_path =
       profile_path_.GetPath()
@@ -79,7 +79,7 @@
       params, base::SingleThreadTaskRunner::GetCurrentDefault(),
       future.GetCallback());
   auto bucket = future.Take();
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
 
   base::FilePath bucket_path =
       profile_path_.GetPath()
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc
index 647a6671..35fb5b4 100644
--- a/storage/browser/quota/quota_manager_unittest.cc
+++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -217,7 +217,7 @@
           {ToStorageKey(data.origin), data.name}, data.type,
           future.GetCallback());
       auto bucket = future.Take();
-      EXPECT_TRUE(bucket.ok());
+      EXPECT_TRUE(bucket.has_value());
       buckets_data.insert(std::pair<BucketLocator, int64_t>(
           bucket->ToBucketLocator(), data.usage));
     }
@@ -629,19 +629,19 @@
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
   EXPECT_FALSE(is_db_bootstrapping());
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   bucket = GetBucket(ToStorageKey("http://foo.com:8080/"), kDefaultBucketName,
                      kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   bucket = GetBucket(ToStorageKey("https://foo.com:8081/"), kDefaultBucketName,
                      kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   bucket =
       GetBucket(ToStorageKey("http://bar.com/"), kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 }
 
 TEST_F(QuotaManagerImplTest, CorruptionRecovery) {
@@ -674,13 +674,13 @@
   // Basic sanity checks, make sure setup worked correctly.
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   bucket = GetBucket(ToStorageKey("http://foo.com:8080/"), kDefaultBucketName,
                      kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   bucket = GetBucket(ToStorageKey("https://foo.com:8081/"), kDefaultBucketName,
                      kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   // Corrupt the database to make bucket lookup fail.
   QuotaError corruption_error = CorruptDatabaseForTesting(
@@ -699,7 +699,7 @@
 
     bucket =
         GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-    ASSERT_FALSE(bucket.ok());
+    ASSERT_FALSE(bucket.has_value());
     EXPECT_EQ(QuotaError::kDatabaseError, bucket.error());
   }
 
@@ -709,7 +709,7 @@
   // And with that bucket lookup should be working again.
   bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 }
 
 TEST_F(QuotaManagerImplTest, GetUsageInfo) {
@@ -753,16 +753,16 @@
   std::string bucket_name = "bucket_a";
 
   auto bucket = UpdateOrCreateBucket({storage_key, bucket_name});
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   ASSERT_FALSE(is_db_disabled());
 
   bucket = UpdateOrCreateBucket({storage_key, bucket_name});
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   ASSERT_FALSE(is_db_disabled());
 
   // Disables access to QuotaDatabase after error counts passes threshold.
   bucket = GetBucket(storage_key, bucket_name, kTemp);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   ASSERT_TRUE(is_db_disabled());
 }
 
@@ -771,12 +771,12 @@
   std::string bucket_name = "bucket_a";
 
   auto bucket = UpdateOrCreateBucket({storage_key, bucket_name});
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   BucketId created_bucket_id = bucket.value().id;
 
   bucket = UpdateOrCreateBucket({storage_key, bucket_name});
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   EXPECT_EQ(bucket.value().id, created_bucket_id);
 }
 
@@ -789,13 +789,13 @@
   params.expiration = clock->Now() - base::Days(1);
 
   auto bucket = UpdateOrCreateBucket(params);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
 
   // Create a new bucket.
   params.expiration = clock->Now() + base::Days(1);
   params.quota = 1000;
   bucket = UpdateOrCreateBucket(params);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   EXPECT_EQ(bucket->expiration, params.expiration);
   EXPECT_EQ(bucket->quota, 1000);
 
@@ -803,7 +803,7 @@
   params.expiration = clock->Now() + base::Days(5);
   params.quota = 500;
   bucket = UpdateOrCreateBucket(params);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   EXPECT_EQ(bucket->expiration, params.expiration);
   EXPECT_EQ(bucket->quota, 1000);
 
@@ -828,16 +828,16 @@
   StorageKey storage_key = ToStorageKey("http://a.com/");
 
   auto bucket_a = UpdateOrCreateBucket({storage_key, "bucket_a"});
-  EXPECT_TRUE(bucket_a.ok());
+  EXPECT_TRUE(bucket_a.has_value());
   auto bucket_b = UpdateOrCreateBucket({storage_key, "bucket_b"});
-  EXPECT_TRUE(bucket_b.ok());
+  EXPECT_TRUE(bucket_b.has_value());
   auto bucket_c = UpdateOrCreateBucket({storage_key, "bucket_c"});
-  EXPECT_FALSE(bucket_c.ok());
+  EXPECT_FALSE(bucket_c.has_value());
   EXPECT_EQ(QuotaError::kQuotaExceeded, bucket_c.error());
 
   // Default bucket shouldn't be limited by the quota.
   auto bucket_default = UpdateOrCreateBucket({storage_key, "default"});
-  EXPECT_TRUE(bucket_default.ok());
+  EXPECT_TRUE(bucket_default.has_value());
 }
 
 // Make sure `EvictExpiredBuckets` deletes expired buckets.
@@ -849,17 +849,17 @@
   BucketInitParams params(ToStorageKey("http://a.com/"), "bucket_a");
   params.expiration = clock->Now() + base::Days(1);
   auto bucket = UpdateOrCreateBucket(params);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   BucketInitParams params_b(ToStorageKey("http://b.com/"), "bucket_b");
   params_b.expiration = clock->Now() + base::Days(10);
   auto bucket_b = UpdateOrCreateBucket(params_b);
-  ASSERT_TRUE(bucket_b.ok());
+  ASSERT_TRUE(bucket_b.has_value());
 
   // No specified expiration.
   BucketInitParams params_c(ToStorageKey("http://c.com/"), "bucket_c");
   auto bucket_c = UpdateOrCreateBucket(params_c);
-  ASSERT_TRUE(bucket_c.ok());
+  ASSERT_TRUE(bucket_c.has_value());
 
   clock->Advance(base::Days(5));
 
@@ -868,9 +868,9 @@
   quota_manager_impl_->EvictExpiredBuckets(future.GetCallback());
   EXPECT_EQ(QuotaStatusCode::kOk, future.Get());
 
-  EXPECT_FALSE(GetBucketById(bucket->id).ok());
-  EXPECT_TRUE(GetBucketById(bucket_b->id).ok());
-  EXPECT_TRUE(GetBucketById(bucket_c->id).ok());
+  EXPECT_FALSE(GetBucketById(bucket->id).has_value());
+  EXPECT_TRUE(GetBucketById(bucket_b->id).has_value());
+  EXPECT_TRUE(GetBucketById(bucket_c->id).has_value());
 
   QuotaDatabase::SetClockForTesting(nullptr);
 }
@@ -886,13 +886,13 @@
         // Ensure that the synchronous function returns a bucket.
         auto bucket =
             quota_manager_impl_->proxy()->GetOrCreateBucketSync(params);
-        ASSERT_TRUE(bucket.ok());
+        ASSERT_TRUE(bucket.has_value());
         BucketId created_bucket_id = bucket.value().id;
 
         // Ensure that the synchronous function does not create a new bucket
         // each time.
         bucket = quota_manager_impl_->proxy()->GetOrCreateBucketSync(params);
-        EXPECT_TRUE(bucket.ok());
+        EXPECT_TRUE(bucket.has_value());
         EXPECT_EQ(bucket.value().id, created_bucket_id);
         loop.Quit();
       }));
@@ -904,16 +904,16 @@
   std::string bucket_name = "bucket_a";
 
   auto bucket = CreateBucketForTesting(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo created_bucket = bucket.value();
 
   bucket = GetBucket(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo retrieved_bucket = bucket.value();
   EXPECT_EQ(created_bucket.id, retrieved_bucket.id);
 
   bucket = GetBucket(storage_key, "bucket_b", kTemp);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   EXPECT_EQ(bucket.error(), QuotaError::kNotFound);
   ASSERT_FALSE(is_db_disabled());
 }
@@ -923,16 +923,16 @@
   std::string bucket_name = "bucket_a";
 
   auto bucket = CreateBucketForTesting(storage_key, bucket_name, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo created_bucket = bucket.value();
 
   bucket = GetBucketById(created_bucket.id);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo retrieved_bucket = bucket.value();
   EXPECT_EQ(created_bucket.id, retrieved_bucket.id);
 
   bucket = GetBucketById(BucketId::FromUnsafeValue(0));
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   EXPECT_EQ(bucket.error(), QuotaError::kNotFound);
   ASSERT_FALSE(is_db_disabled());
 }
@@ -943,15 +943,15 @@
   StorageKey storage_key_c = ToStorageKey("http://c.com/");
 
   auto bucket = CreateBucketForTesting(storage_key_a, "bucket_a", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_a = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_b, "bucket_b", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_b = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_c, kDefaultBucketName, kSync);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_c = bucket.value();
 
   std::set<StorageKey> storage_keys = GetStorageKeysForType(kTemp);
@@ -985,7 +985,7 @@
 
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   histograms.ExpectBucketCount("Quota.QuotaDatabaseResultSuccess",
                                /*sample=*/true, /*expected_count=*/1);
@@ -1001,7 +1001,7 @@
   // Refetching the bucket with a corrupted database should return an error.
   bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   EXPECT_EQ(QuotaError::kDatabaseError, bucket.error());
 
   histograms.ExpectBucketCount("Quota.QuotaDatabaseResultSuccess",
@@ -1014,19 +1014,19 @@
   StorageKey storage_key_c = ToStorageKey("http://c.com/");
 
   auto bucket = CreateBucketForTesting(storage_key_a, "bucket_a", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_a = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_b, "bucket_b", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_b = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_c, kDefaultBucketName, kSync);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_c = bucket.value();
 
   QuotaErrorOr<std::set<BucketInfo>> result = GetBucketsForType(kTemp);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
 
   std::set<BucketInfo> buckets = result.value();
   EXPECT_EQ(2U, buckets.size());
@@ -1046,20 +1046,20 @@
 
   auto bucket =
       CreateBucketForTesting(host_a_storage_key_1, kDefaultBucketName, kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo host_a_bucket_1 = bucket.value();
 
   bucket = CreateBucketForTesting(host_a_storage_key_2, "test", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo host_a_bucket_2 = bucket.value();
 
   bucket =
       CreateBucketForTesting(host_b_storage_key, kDefaultBucketName, kSync);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo host_b_bucket = bucket.value();
 
   QuotaErrorOr<std::set<BucketInfo>> result = GetBucketsForHost("a.com", kTemp);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
 
   std::set<BucketInfo> buckets = result.value();
   EXPECT_EQ(2U, buckets.size());
@@ -1078,24 +1078,24 @@
   StorageKey storage_key_c = ToStorageKey("http://c.com/");
 
   auto bucket = CreateBucketForTesting(storage_key_a, "bucket_a1", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_a1 = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_a, "bucket_a2", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_a2 = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_b, "bucket_b", kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_b = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_c, kDefaultBucketName, kSync);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_c = bucket.value();
 
   QuotaErrorOr<std::set<BucketInfo>> result =
       GetBucketsForStorageKey(storage_key_a, kTemp);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
 
   std::set<BucketInfo> buckets = result.value();
   EXPECT_EQ(2U, buckets.size());
@@ -1103,11 +1103,11 @@
   EXPECT_THAT(buckets, testing::Contains(bucket_a2));
 
   result = GetBucketsForStorageKey(storage_key_a, kSync);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
   EXPECT_TRUE(result.value().empty());
 
   result = GetBucketsForStorageKey(storage_key_c, kSync);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
 
   buckets = result.value();
   EXPECT_EQ(1U, buckets.size());
@@ -1123,25 +1123,25 @@
 
   BucketInitParams params(storage_key, "bucket_1");
   auto bucket = UpdateOrCreateBucket(params);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_1 = bucket.value();
 
   params.name = "bucket_2";
   params.expiration = clock->Now() + base::Days(1);
   bucket = UpdateOrCreateBucket(params);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_2 = bucket.value();
 
   params.name = "bucket_3";
   bucket = UpdateOrCreateBucket(params);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
   BucketInfo bucket_3 = bucket.value();
 
   clock->Advance(base::Days(2));
 
   QuotaErrorOr<std::set<BucketInfo>> result =
       GetBucketsForStorageKey(storage_key, kTemp, /*delete_expired=*/true);
-  EXPECT_TRUE(result.ok());
+  EXPECT_TRUE(result.has_value());
 
   std::set<BucketInfo> buckets = result.value();
   ASSERT_EQ(1U, buckets.size());
@@ -1188,14 +1188,14 @@
   // Initialize the logs bucket with a non-default quota.
   BucketInitParams params(ToStorageKey("http://foo.com/"), "logs");
   params.quota = 117;
-  ASSERT_TRUE(UpdateOrCreateBucket(params).ok());
+  ASSERT_TRUE(UpdateOrCreateBucket(params).has_value());
 
   RegisterClientBucketData(fs_client, kData);
 
   {
     QuotaErrorOr<BucketInfo> bucket =
         UpdateOrCreateBucket({ToStorageKey("http://foo.com/"), "logs"});
-    ASSERT_TRUE(bucket.ok());
+    ASSERT_TRUE(bucket.has_value());
     auto result = GetUsageAndQuotaForBucket(bucket.value());
     EXPECT_EQ(result.status, QuotaStatusCode::kOk);
     EXPECT_EQ(result.usage, 10);
@@ -1205,7 +1205,7 @@
   {
     QuotaErrorOr<BucketInfo> bucket =
         UpdateOrCreateBucket({ToStorageKey("http://foo.com/"), "inbox"});
-    ASSERT_TRUE(bucket.ok());
+    ASSERT_TRUE(bucket.has_value());
     auto result = GetUsageAndQuotaForBucket(bucket.value());
     EXPECT_EQ(result.status, QuotaStatusCode::kOk);
     EXPECT_EQ(result.usage, 60);
@@ -1581,7 +1581,8 @@
                                1);
 
   // Database call to ensure modification calls have completed.
-  GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
+  std::ignore =
+      GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
 
   result = GetUsageAndQuotaForWebApps(ToStorageKey("http://foo.com/"), kTemp);
   EXPECT_EQ(result.status, QuotaStatusCode::kOk);
@@ -1596,7 +1597,8 @@
                                40);
 
   // Database call to ensure modification calls have completed.
-  GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
+  std::ignore =
+      GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
 
   result = GetUsageAndQuotaForWebApps(ToStorageKey("http://bar.com/"), kTemp);
   EXPECT_EQ(result.status, QuotaStatusCode::kOk);
@@ -1979,7 +1981,7 @@
 
   auto foo_temp_bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(foo_temp_bucket.ok());
+  ASSERT_TRUE(foo_temp_bucket.has_value());
   client->ModifyBucketAndNotify(foo_temp_bucket->ToBucketLocator(), 80000000);
 
   global_usage_result = GetGlobalUsage(kTemp);
@@ -1992,7 +1994,7 @@
 
   auto foo_sync_bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kSync);
-  ASSERT_TRUE(foo_sync_bucket.ok());
+  ASSERT_TRUE(foo_sync_bucket.has_value());
   client->ModifyBucketAndNotify(foo_sync_bucket->ToBucketLocator(), 200);
 
   global_usage_result = GetGlobalUsage(kSync);
@@ -2005,7 +2007,7 @@
 
   auto bar_temp_bucket =
       GetBucket(ToStorageKey("http://bar.com/"), "logs", kTemp);
-  ASSERT_TRUE(bar_temp_bucket.ok());
+  ASSERT_TRUE(bar_temp_bucket.has_value());
   client->ModifyBucketAndNotify(bar_temp_bucket->ToBucketLocator(), 900000000);
 
   EXPECT_EQ(100 + 900000000, GetStorageKeyUsageWithBreakdown(
@@ -2037,7 +2039,7 @@
 
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
 
   auto status = DeleteBucketData(bucket->ToBucketLocator(),
                                  {QuotaClientType::kFileSystem});
@@ -2106,13 +2108,13 @@
   // Default bucket eviction.
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   ASSERT_EQ(EvictBucketData(bucket->ToBucketLocator()), QuotaError::kNone);
 
   bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   ASSERT_EQ(bucket.error(), QuotaError::kNotFound);
 
   global_usage_result = GetGlobalUsage(kTemp);
@@ -2129,7 +2131,7 @@
 
   // Non default bucket eviction.
   bucket = GetBucket(ToStorageKey("http://foo.com"), "logs", kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   ASSERT_EQ(EvictBucketData(bucket->ToBucketLocator()), QuotaError::kNone);
 
@@ -2163,7 +2165,7 @@
 
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   ASSERT_EQ(EvictBucketData(bucket->ToBucketLocator()), QuotaError::kNone);
 
@@ -2183,7 +2185,7 @@
   GetGlobalUsage(kTemp);
 
   bucket = GetBucket(ToStorageKey("http://bar.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   ASSERT_EQ(EvictBucketData(bucket->ToBucketLocator()), QuotaError::kNone);
 
@@ -2227,7 +2229,7 @@
 
   auto bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   client->AddBucketToErrorSet(bucket->ToBucketLocator());
 
   for (int i = 0; i < QuotaManagerImpl::kThresholdOfErrorsToBeDenylisted + 1;
@@ -2238,7 +2240,7 @@
   // The default bucket for "http://foo.com/" should still be in the database.
   bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  EXPECT_TRUE(bucket.ok());
+  EXPECT_TRUE(bucket.has_value());
 
   for (size_t i = 0; i < kNumberOfTemporaryBuckets - 1; ++i) {
     GetEvictionBucket(kTemp);
@@ -2538,7 +2540,7 @@
 TEST_F(QuotaManagerImplTest, DeleteBucketNoClients) {
   auto bucket = CreateBucketForTesting(ToStorageKey("http://foo.com"),
                                        kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   EXPECT_EQ(DeleteBucketData(bucket->ToBucketLocator(), AllQuotaClientTypes()),
             QuotaStatusCode::kOk);
@@ -2567,11 +2569,11 @@
 
   auto foo_temp_bucket =
       GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(foo_temp_bucket.ok());
+  ASSERT_TRUE(foo_temp_bucket.has_value());
 
   auto bar_temp_bucket =
       GetBucket(ToStorageKey("http://bar.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bar_temp_bucket.ok());
+  ASSERT_TRUE(bar_temp_bucket.has_value());
 
   auto global_usage_result = GetGlobalUsage(kTemp);
   const int64_t predelete_global_tmp = global_usage_result.usage;
@@ -2669,11 +2671,11 @@
 
   auto foo_sync_bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kSync);
-  ASSERT_TRUE(foo_sync_bucket.ok());
+  ASSERT_TRUE(foo_sync_bucket.has_value());
 
   auto bar_sync_bucket =
       GetBucket(ToStorageKey("http://bar.com/"), kDefaultBucketName, kSync);
-  ASSERT_TRUE(bar_sync_bucket.ok());
+  ASSERT_TRUE(bar_sync_bucket.has_value());
 
   auto global_usage_result = GetGlobalUsage(kTemp);
   const int64_t predelete_global_tmp = global_usage_result.usage;
@@ -2773,11 +2775,11 @@
 
   auto foo_bucket =
       GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(foo_bucket.ok());
+  ASSERT_TRUE(foo_bucket.has_value());
 
   auto bar_bucket =
       GetBucket(ToStorageKey("http://bar.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bar_bucket.ok());
+  ASSERT_TRUE(bar_bucket.has_value());
 
   // Check usage data before deletion.
   auto global_usage_result = GetGlobalUsage(kTemp);
@@ -2797,7 +2799,7 @@
 
   auto bucket =
       GetBucket(foo_bucket->storage_key, foo_bucket->name, foo_bucket->type);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   EXPECT_EQ(bucket.error(), QuotaError::kNotFound);
 
   global_usage_result = GetGlobalUsage(kTemp);
@@ -2813,7 +2815,7 @@
 
   bucket =
       GetBucket(bar_bucket->storage_key, bar_bucket->name, bar_bucket->type);
-  ASSERT_FALSE(bucket.ok());
+  ASSERT_FALSE(bucket.has_value());
   EXPECT_EQ(bucket.error(), QuotaError::kNotFound);
 
   global_usage_result = GetGlobalUsage(kTemp);
@@ -2937,15 +2939,15 @@
 
   auto bucket =
       CreateBucketForTesting(storage_key_a, kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo bucket_a = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_b, kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo bucket_b = bucket.value();
 
   bucket = CreateBucketForTesting(storage_key_c, kDefaultBucketName, kSync);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
   BucketInfo bucket_c = bucket.value();
 
   NotifyBucketAccessed(bucket_a.ToBucketLocator());
@@ -3002,7 +3004,8 @@
   base::Time time3 = client->IncrementMockTime();
 
   // Database call to ensure modification calls have completed.
-  GetBucket(ToStorageKey("http://a.com"), kDefaultBucketName, kTemp);
+  std::ignore =
+      GetBucket(ToStorageKey("http://a.com"), kDefaultBucketName, kTemp);
 
   buckets = GetBucketsModifiedBetween(kTemp, time1, base::Time::Max());
   EXPECT_THAT(buckets, testing::UnorderedElementsAre(
@@ -3025,7 +3028,8 @@
                                10);
 
   // Database call to ensure modification calls have completed.
-  GetBucket(ToStorageKey("http://a.com"), kDefaultBucketName, kTemp);
+  std::ignore =
+      GetBucket(ToStorageKey("http://a.com"), kDefaultBucketName, kTemp);
 
   buckets = GetBucketsModifiedBetween(kTemp, time3, base::Time::Max());
   EXPECT_THAT(buckets,
@@ -3053,8 +3057,8 @@
   EXPECT_TRUE(initial_entries.empty());
 
   const StorageKey kStorageKey = ToStorageKey("http://example.com/");
-  CreateBucketForTesting(kStorageKey, kDefaultBucketName, kTemp);
-  CreateBucketForTesting(kStorageKey, kDefaultBucketName, kSync);
+  std::ignore = CreateBucketForTesting(kStorageKey, kDefaultBucketName, kTemp);
+  std::ignore = CreateBucketForTesting(kStorageKey, kDefaultBucketName, kSync);
 
   NotifyDefaultBucketAccessed(kStorageKey, kTemp, base::Time::Now());
   NotifyDefaultBucketAccessed(kStorageKey, kSync, base::Time::Now());
@@ -3146,7 +3150,7 @@
 
   auto foo_bucket =
       GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(foo_bucket.ok());
+  ASSERT_TRUE(foo_bucket.has_value());
 
   const int64_t predelete_sk_foo_tmp =
       GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp)
@@ -3208,7 +3212,7 @@
 
   auto foo_bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(foo_bucket.ok());
+  ASSERT_TRUE(foo_bucket.has_value());
 
   const int64_t predelete_sk_foo_tmp =
       GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp)
@@ -3438,7 +3442,7 @@
 
   QuotaErrorOr<BucketInfo> bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   base::test::TestFuture<QuotaStatusCode> delete_bucket_data_future;
   quota_manager_impl_->DeleteBucketData(
@@ -3458,7 +3462,7 @@
 
   QuotaErrorOr<BucketInfo> bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   base::RunLoop run_loop;
   QuotaStatusCode delete_bucket_data_result = QuotaStatusCode::kUnknown;
@@ -3484,7 +3488,7 @@
 
   QuotaErrorOr<BucketInfo> bucket =
       GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp);
-  ASSERT_TRUE(bucket.ok());
+  ASSERT_TRUE(bucket.has_value());
 
   auto status = DeleteBucketData(bucket->ToBucketLocator(),
                                  {QuotaClientType::kFileSystem});
diff --git a/storage/browser/quota/usage_tracker.cc b/storage/browser/quota/usage_tracker.cc
index e6b281bc9..c5ec025bd 100644
--- a/storage/browser/quota/usage_tracker.cc
+++ b/storage/browser/quota/usage_tracker.cc
@@ -181,7 +181,7 @@
     QuotaErrorOr<std::set<BucketInfo>> result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto info = std::make_unique<AccumulateInfo>();
-  if (!result.ok()) {
+  if (!result.has_value()) {
     // Return with invalid values on error.
     info->usage = -1;
     info->unlimited_usage = -1;
@@ -224,7 +224,7 @@
     QuotaErrorOr<std::set<BucketInfo>> result) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto info = std::make_unique<AccumulateInfo>();
-  if (!result.ok()) {
+  if (!result.has_value()) {
     // Return with invalid values on error.
     info->usage = -1;
     info->unlimited_usage = -1;
diff --git a/storage/browser/quota/usage_tracker_unittest.cc b/storage/browser/quota/usage_tracker_unittest.cc
index bdd32ee..2fbdbe8 100644
--- a/storage/browser/quota/usage_tracker_unittest.cc
+++ b/storage/browser/quota/usage_tracker_unittest.cc
@@ -179,7 +179,7 @@
                                            StorageType::kTemporary,
                                            future.GetCallback());
     QuotaErrorOr<BucketInfo> bucket_result = future.Take();
-    DCHECK(bucket_result.ok());
+    DCHECK(bucket_result.has_value());
     return bucket_result.value().ToBucketLocator();
   }
 
diff --git a/storage/browser/test/mock_quota_manager.cc b/storage/browser/test/mock_quota_manager.cc
index 0b676bb..6d320d63 100644
--- a/storage/browser/test/mock_quota_manager.cc
+++ b/storage/browser/test/mock_quota_manager.cc
@@ -58,13 +58,13 @@
     const BucketInitParams& params,
     base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
 
   QuotaErrorOr<BucketInfo> bucket_or =
       FindAndUpdateBucket(params, blink::mojom::StorageType::kTemporary);
-  if (bucket_or.ok()) {
+  if (bucket_or.has_value()) {
     std::move(callback).Run(std::move(bucket_or));
     return;
   }
@@ -110,12 +110,12 @@
     blink::mojom::StorageType type,
     base::OnceCallback<void(QuotaErrorOr<BucketInfo>)> callback) {
   if (db_disabled_) {
-    std::move(callback).Run(QuotaError::kDatabaseError);
+    std::move(callback).Run(base::unexpected(QuotaError::kDatabaseError));
     return;
   }
 
   QuotaErrorOr<BucketInfo> bucket_or = FindAndUpdateBucket(params, type);
-  if (bucket_or.ok()) {
+  if (bucket_or.has_value()) {
     std::move(callback).Run(std::move(bucket_or));
     return;
   }
@@ -177,7 +177,7 @@
       }));
   for (const auto& entry : usage_map_) {
     QuotaErrorOr<BucketInfo> result = FindBucket(entry.first);
-    if (result.ok()) {
+    if (result.has_value()) {
       storage::BucketLocator bucket_locator = result->ToBucketLocator();
       if (bucket_locator.storage_key == storage_key &&
           bucket_locator.type == type) {
@@ -278,7 +278,7 @@
                                                StatusCallback callback) {
   QuotaErrorOr<BucketInfo> result = FindBucket(
       storage_key, bucket_name, blink::mojom::StorageType::kTemporary);
-  if (!result.ok()) {
+  if (!result.has_value()) {
     if (result.error() == QuotaError::kNotFound) {
       std::move(callback).Run(blink::mojom::QuotaStatusCode::kOk);
     } else {
@@ -302,7 +302,7 @@
     it->bucket.persistent = persistent;
     std::move(callback).Run(it->bucket);
   } else {
-    std::move(callback).Run(QuotaError::kNotFound);
+    std::move(callback).Run(base::unexpected(QuotaError::kNotFound));
   }
 }
 
@@ -323,7 +323,7 @@
   if (it != buckets_.end()) {
     return it->bucket;
   }
-  return QuotaError::kNotFound;
+  return base::unexpected(QuotaError::kNotFound);
 }
 
 QuotaErrorOr<BucketInfo> MockQuotaManager::FindBucket(
@@ -340,7 +340,7 @@
   if (it != buckets_.end()) {
     return it->bucket;
   }
-  return QuotaError::kNotFound;
+  return base::unexpected(QuotaError::kNotFound);
 }
 
 QuotaErrorOr<BucketInfo> MockQuotaManager::FindBucket(
@@ -352,7 +352,7 @@
   if (it != buckets_.end()) {
     return it->bucket;
   }
-  return QuotaError::kNotFound;
+  return base::unexpected(QuotaError::kNotFound);
 }
 
 QuotaErrorOr<BucketInfo> MockQuotaManager::FindAndUpdateBucket(
@@ -371,7 +371,7 @@
       it->bucket.expiration = params.expiration;
     return it->bucket;
   }
-  return QuotaError::kNotFound;
+  return base::unexpected(QuotaError::kNotFound);
 }
 
 void MockQuotaManager::UpdateUsage(const BucketLocator& bucket, int64_t delta) {
diff --git a/storage/browser/test/mock_quota_manager_proxy.cc b/storage/browser/test/mock_quota_manager_proxy.cc
index a0dff37..bde902a 100644
--- a/storage/browser/test/mock_quota_manager_proxy.cc
+++ b/storage/browser/test/mock_quota_manager_proxy.cc
@@ -36,7 +36,7 @@
     const BucketInitParams& params) {
   return (mock_quota_manager_)
              ? mock_quota_manager_->GetOrCreateBucketSync(params)
-             : QuotaError::kUnknownError;
+             : base::unexpected(QuotaError::kUnknownError);
 }
 
 void MockQuotaManagerProxy::CreateBucketForTesting(
diff --git a/storage/browser/test/mock_quota_manager_unittest.cc b/storage/browser/test/mock_quota_manager_unittest.cc
index 2d9c533..25d2169 100644
--- a/storage/browser/test/mock_quota_manager_unittest.cc
+++ b/storage/browser/test/mock_quota_manager_unittest.cc
@@ -216,7 +216,7 @@
 
   QuotaErrorOr<BucketInfo> bucket1 =
       GetOrCreateBucket(kStorageKey1, kBucketName);
-  EXPECT_TRUE(bucket1.ok());
+  EXPECT_TRUE(bucket1.has_value());
   EXPECT_EQ(bucket1->storage_key, kStorageKey1);
   EXPECT_EQ(bucket1->name, kBucketName);
   EXPECT_EQ(bucket1->type, kTemporary);
@@ -225,7 +225,7 @@
 
   QuotaErrorOr<BucketInfo> bucket2 =
       GetOrCreateBucket(kStorageKey2, kBucketName);
-  EXPECT_TRUE(bucket2.ok());
+  EXPECT_TRUE(bucket2.has_value());
   EXPECT_EQ(bucket2->storage_key, kStorageKey2);
   EXPECT_EQ(bucket2->name, kBucketName);
   EXPECT_EQ(bucket2->type, kTemporary);
@@ -234,7 +234,7 @@
 
   QuotaErrorOr<BucketInfo> dupe_bucket =
       GetOrCreateBucket(kStorageKey1, kBucketName);
-  EXPECT_TRUE(dupe_bucket.ok());
+  EXPECT_TRUE(dupe_bucket.has_value());
   EXPECT_EQ(dupe_bucket.value(), bucket1.value());
   EXPECT_EQ(manager()->BucketDataCount(kClientFile), 2);
 
@@ -259,7 +259,7 @@
 
   BucketInitParams params(kStorageKey1, kBucketName);
   QuotaErrorOr<BucketInfo> bucket1 = manager()->GetOrCreateBucketSync(params);
-  EXPECT_TRUE(bucket1.ok());
+  EXPECT_TRUE(bucket1.has_value());
   EXPECT_EQ(bucket1->storage_key, kStorageKey1);
   EXPECT_EQ(bucket1->name, kBucketName);
   EXPECT_EQ(bucket1->type, kTemporary);
@@ -268,7 +268,7 @@
 
   params = BucketInitParams(kStorageKey2, kBucketName);
   QuotaErrorOr<BucketInfo> bucket2 = manager()->GetOrCreateBucketSync(params);
-  EXPECT_TRUE(bucket2.ok());
+  EXPECT_TRUE(bucket2.has_value());
   EXPECT_EQ(bucket2->storage_key, kStorageKey2);
   EXPECT_EQ(bucket2->name, kBucketName);
   EXPECT_EQ(bucket2->type, kTemporary);
@@ -278,7 +278,7 @@
   params = BucketInitParams(kStorageKey1, kBucketName);
   QuotaErrorOr<BucketInfo> dupe_bucket =
       manager()->GetOrCreateBucketSync(params);
-  EXPECT_TRUE(dupe_bucket.ok());
+  EXPECT_TRUE(dupe_bucket.has_value());
   EXPECT_EQ(dupe_bucket.value(), bucket1.value());
   EXPECT_EQ(manager()->BucketDataCount(kClientFile), 2);
 
@@ -303,7 +303,7 @@
 
   QuotaErrorOr<BucketInfo> bucket1 =
       CreateBucketForTesting(kStorageKey1, kBucketName, kTemporary);
-  EXPECT_TRUE(bucket1.ok());
+  EXPECT_TRUE(bucket1.has_value());
   EXPECT_EQ(bucket1->storage_key, kStorageKey1);
   EXPECT_EQ(bucket1->name, kBucketName);
   EXPECT_EQ(bucket1->type, kTemporary);
@@ -312,7 +312,7 @@
 
   QuotaErrorOr<BucketInfo> bucket2 =
       CreateBucketForTesting(kStorageKey2, kBucketName, kTemporary);
-  EXPECT_TRUE(bucket2.ok());
+  EXPECT_TRUE(bucket2.has_value());
   EXPECT_EQ(bucket2->storage_key, kStorageKey2);
   EXPECT_EQ(bucket2->name, kBucketName);
   EXPECT_EQ(bucket2->type, kTemporary);
@@ -321,7 +321,7 @@
 
   QuotaErrorOr<BucketInfo> dupe_bucket =
       GetOrCreateBucket(kStorageKey1, kBucketName);
-  EXPECT_TRUE(dupe_bucket.ok());
+  EXPECT_TRUE(dupe_bucket.has_value());
   EXPECT_EQ(dupe_bucket.value(), bucket1.value());
   EXPECT_EQ(manager()->BucketDataCount(kClientFile), 2);
 }
@@ -335,10 +335,10 @@
   {
     QuotaErrorOr<BucketInfo> created =
         GetOrCreateBucket(kStorageKey1, kDefaultBucketName);
-    EXPECT_TRUE(created.ok());
+    EXPECT_TRUE(created.has_value());
     QuotaErrorOr<BucketInfo> fetched =
         GetBucket(kStorageKey1, kDefaultBucketName, kTemporary);
-    EXPECT_TRUE(fetched.ok());
+    EXPECT_TRUE(fetched.has_value());
     EXPECT_EQ(fetched.value(), created.value());
     EXPECT_EQ(fetched->storage_key, kStorageKey1);
     EXPECT_EQ(fetched->name, kDefaultBucketName);
@@ -348,10 +348,10 @@
   {
     QuotaErrorOr<BucketInfo> created =
         GetOrCreateBucket(kStorageKey2, kDefaultBucketName);
-    EXPECT_TRUE(created.ok());
+    EXPECT_TRUE(created.has_value());
     QuotaErrorOr<BucketInfo> fetched =
         GetBucket(kStorageKey2, kDefaultBucketName, kTemporary);
-    EXPECT_TRUE(fetched.ok());
+    EXPECT_TRUE(fetched.has_value());
     EXPECT_EQ(fetched.value(), created.value());
     EXPECT_EQ(fetched->storage_key, kStorageKey2);
     EXPECT_EQ(fetched->name, kDefaultBucketName);
@@ -360,7 +360,7 @@
 
   QuotaErrorOr<BucketInfo> not_found =
       GetBucket(kStorageKey1, kDefaultBucketName, kSyncable);
-  EXPECT_FALSE(not_found.ok());
+  EXPECT_FALSE(not_found.has_value());
 }
 
 TEST_F(MockQuotaManagerTest, BasicBucketManipulation) {
@@ -508,24 +508,24 @@
 
   QuotaErrorOr<BucketInfo> result =
       GetOrCreateBucketDeprecated(storage_key1, kTemporary, kDefaultBucketName);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   const BucketLocator storage_key1_temp_default_bucket =
       result->ToBucketLocator();
 
   result = GetOrCreateBucketDeprecated(storage_key1, kTemporary, "non-default");
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   const BucketLocator storage_key1_temp_named_bucket =
       result->ToBucketLocator();
 
   result =
       GetOrCreateBucketDeprecated(storage_key1, kSyncable, kDefaultBucketName);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   const BucketLocator storage_key1_sync_default_bucket =
       result->ToBucketLocator();
 
   result =
       GetOrCreateBucketDeprecated(storage_key2, kTemporary, kDefaultBucketName);
-  ASSERT_TRUE(result.ok());
+  ASSERT_TRUE(result.has_value());
   const BucketLocator storage_key2_temp_default_bucket =
       result->ToBucketLocator();
 
diff --git a/testing/buildbot/filters/android.emulator.gl_tests.filter b/testing/buildbot/filters/android.emulator.gl_tests.filter
index 2b7e71c5..fbab6d18 100644
--- a/testing/buildbot/filters/android.emulator.gl_tests.filter
+++ b/testing/buildbot/filters/android.emulator.gl_tests.filter
@@ -14,7 +14,7 @@
 # Something is broken on android-pie-x86-rel with Skia and these formats, see
 # https://crbug.com/1411266 for details.
 -WrappedSkImageBackingFactoryTest.*/ALPHA_8
--WrappedSkImageBackingFactoryTest.*/RED_8
+-WrappedSkImageBackingFactoryTest.*/R_8
 -WrappedSkImageBackingFactoryTest.*/RG_88
 -WrappedSkImageBackingFactoryTest.*/RGBA_1010102
 -WrappedSkImageBackingFactoryTest.*/Y_UV_420_8unorm
diff --git a/testing/buildbot/filters/pixel_tests.filter b/testing/buildbot/filters/pixel_tests.filter
index 89bd2d67..3ad131fd 100644
--- a/testing/buildbot/filters/pixel_tests.filter
+++ b/testing/buildbot/filters/pixel_tests.filter
@@ -5,10 +5,6 @@
 # Since these tests will all run in both browser_tests (or interactive_ui_tests)
 # and pixel_browser_tests (or pixel_interactive_ui_tests), avoid including
 # non-pixel tests here.
-#
-# Prefer browser_tests to interactive_ui_tests, as they are less expensive to
-# run; only use interactive_ui_tests if running your test in browser_tests
-# causes flakes (due to widget activation, occlusion, etc.)
 
 AccessCodeCastDialogBrowserTest.*
 AppInfoDialogBrowserTest.*
@@ -86,15 +82,12 @@
 WebAppConfirmViewBrowserTest.*
 ZoomBubbleDialogTest.*
 
+# To temporarily disable a test, add it here with a leading '-', like this:
+#
+# # TODO(crbug.com/xxx): Fix xyz and re-enable.
+# -MyTestSuite.InvokeUi_MyTestCase
+
 # This test uses random network port and shows it on ui.
 -ContentSettingBubbleDialogTest.InvokeUi_popups
+
 -OutdatedUpgradeBubbleTest.InvokeUi_Critical
-# TODO(crbug.com/1108988): Fix this flakiness test.
--BookmarkBubbleViewBrowserTest.InvokeUi_bookmark_details_signed_in
-
-# TODO(crbug.com/2666206): Flaky
--ContentSettingBubbleDialogTest.InvokeUi_mediastream_camera
--ContentSettingBubbleDialogTest.InvokeUi_mediastream_mic_and_camera
-
-# TODO(crbug.com/1164574): Flaky
--ContentSettingBubbleDialogTest.InvokeUi_mediastream_mic
diff --git a/testing/scripts/OWNERS b/testing/scripts/OWNERS
index 272ba49..2476872 100644
--- a/testing/scripts/OWNERS
+++ b/testing/scripts/OWNERS
@@ -7,11 +7,6 @@
 per-file check_static_initializers.py=thakis@chromium.org
 per-file check_static_initializers.py=thomasanderson@chromium.org
 
-per-file run_wpt_tests.py=weizhong@google.com
-per-file wpt_common.py=weizhong@google.com
-per-file run_wpt_tests.py=jonathanjlee@google.com
-per-file wpt_common.py=jonathanjlee@google.com
-
 per-file run_performance_tests.py=johnchen@chromium.org
 per-file run_performance_tests.py=wenbinzhang@google.com
 
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 314baa0f2..1f868fd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -198,21 +198,6 @@
             ]
         }
     ],
-    "AndroidBindingManagerUseNotPerceptibleBinding": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20220830",
-                    "enable_features": [
-                        "BindingManagerUseNotPerceptibleBinding"
-                    ]
-                }
-            ]
-        }
-    ],
     "AndroidFrameDeadline": [
         {
             "platforms": [
@@ -2818,6 +2803,21 @@
             ]
         }
     ],
+    "ChromeStartRefactor": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "StartSurfaceRefactor"
+                    ]
+                }
+            ]
+        }
+    ],
     "ChromeStartReturnTime": [
         {
             "platforms": [
@@ -6856,6 +6856,33 @@
             ]
         }
     ],
+    "JourneysNavigationContextClustering": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "fuchsia",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "JourneysPersistClustersInHistoryDbAfterStartupDelayMinutes": "1",
+                        "JourneysPersistClustersInHistoryDbPeriodMinutes": "1",
+                        "persist_clusters_recluster_window_days": "0",
+                        "persist_on_query": "true"
+                    },
+                    "enable_features": [
+                        "HistoryClustersNavigationContextClustering",
+                        "HistoryClustersPersistedClusters"
+                    ]
+                }
+            ]
+        }
+    ],
     "JourneysNonSupportedLocales": [
         {
             "platforms": [
@@ -6876,27 +6903,6 @@
             ]
         }
     ],
-    "JourneysPersistence": [
-        {
-            "platforms": [
-                "chromeos",
-                "chromeos_lacros",
-                "fuchsia",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {},
-                    "enable_features": [
-                        "HistoryClustersPersistedClusters"
-                    ]
-                }
-            ]
-        }
-    ],
     "JourneysSuggestionRow": [
         {
             "platforms": [
@@ -14242,6 +14248,21 @@
             ]
         }
     ],
+    "WinSboxAllowSystemFonts": [
+        {
+            "platforms": [
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Disabled",
+                    "disable_features": [
+                        "WinSboxAllowSystemFonts"
+                    ]
+                }
+            ]
+        }
+    ],
     "ZeroCopyTabCaptureStudyMac": [
         {
             "platforms": [
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
index d67ef98..2934bcd 100644
--- a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
+++ b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
@@ -490,7 +490,7 @@
             String depTargetName = translateTargetName(dep.id) + '_java'
 
             /* groovylint-disable-next-line EmptyIfStatement */
-            if (DISALLOW_DEPS.get(dep.id) || dep.exclude) {
+            if (dep.id in DISALLOW_DEPS || dep.exclude) {
               // Do not depend on excluded or disallowed deps.
             } else if (existingLib) {
                 depsStr += "\"${existingLib}\","
diff --git a/third_party/blink/common/storage_key/storage_key.cc b/third_party/blink/common/storage_key/storage_key.cc
index e0d32f1..141dda6f 100644
--- a/third_party/blink/common/storage_key/storage_key.cc
+++ b/third_party/blink/common/storage_key/storage_key.cc
@@ -154,6 +154,11 @@
 
   switch (first_attribute.value()) {
     case EncodedAttribute::kTopLevelSite: {
+      // Cross-Origin keys cannot be read if partitioning is off.
+      if (!IsThirdPartyStoragePartitioningEnabled()) {
+        return absl::nullopt;
+      }
+
       // A top-level site is serialized and has only one encoded attribute.
       if (pos_second_caret != std::string::npos) {
         return absl::nullopt;
@@ -198,6 +203,11 @@
                         blink::mojom::AncestorChainBit::kCrossSite);
     }
     case EncodedAttribute::kAncestorChainBit: {
+      // Same-Origin kCrossSite keys cannot be read if partitioning is off.
+      if (!IsThirdPartyStoragePartitioningEnabled()) {
+        return absl::nullopt;
+      }
+
       // An ancestor chain bit is serialized and has only one encoded attribute.
       if (pos_second_caret != std::string::npos) {
         return absl::nullopt;
@@ -301,6 +311,11 @@
     case EncodedAttribute::kTopLevelSiteOpaqueNonceHigh: {
       // An opaque `top_level_site` is serialized.
 
+      // Cross-Origin keys cannot be read if partitioning is off.
+      if (!IsThirdPartyStoragePartitioningEnabled()) {
+        return absl::nullopt;
+      }
+
       // Make sure we found the next separator, it's valid, that it's the
       // correct attribute.
       if (pos_second_caret == std::string::npos ||
@@ -601,8 +616,7 @@
   // Else if storage partitioning is enabled we need to serialize the key to fit
   // one of the following schemes:
   //
-  // Case 1: If the origin matches top_level_site and the ancestor_chain_bit is
-  // kSameSite:
+  // Case 1: If the ancestor_chain_bit is kSameSite or partitioning is disabled:
   //
   // <StorageKey `key`.origin> + "/"
   //
@@ -625,8 +639,7 @@
   // `key`.top_level_site.nonce.Low64Bits>  + "^6" + <StorageKey
   // `key`.top_level_site.precursor>
   if (IsThirdPartyStoragePartitioningEnabled() &&
-      (top_level_site_ != net::SchemefulSite(origin_) ||
-       ancestor_chain_bit_ == blink::mojom::AncestorChainBit::kCrossSite)) {
+      ancestor_chain_bit_ == blink::mojom::AncestorChainBit::kCrossSite) {
     if (top_level_site_.opaque()) {
       // Case 4.
       return base::StrCat({
diff --git a/third_party/blink/common/storage_key/storage_key_string_fuzzer.cc b/third_party/blink/common/storage_key/storage_key_string_fuzzer.cc
index 9df0f140..c8200d9 100644
--- a/third_party/blink/common/storage_key/storage_key_string_fuzzer.cc
+++ b/third_party/blink/common/storage_key/storage_key_string_fuzzer.cc
@@ -27,22 +27,15 @@
     absl::optional<blink::StorageKey> maybe_storage_key =
         blink::StorageKey::Deserialize(serialized_storage_key);
     if (maybe_storage_key) {
-      // We need to force enable third-party partitioning before serializing
-      // to ensure no information is lost due to partitioning being disabled.
-      assert(
-          maybe_storage_key->CopyWithForceEnabledThirdPartyStoragePartitioning()
-              .Serialize() == serialized_storage_key);
+      assert(maybe_storage_key->Serialize() == serialized_storage_key);
     }
 
     // LocalStorage deserialization test.
     maybe_storage_key =
         blink::StorageKey::DeserializeForLocalStorage(serialized_storage_key);
     if (maybe_storage_key) {
-      // We need to force enable third-party partitioning before serializing
-      // to ensure no information is lost due to partitioning being disabled.
-      assert(
-          maybe_storage_key->CopyWithForceEnabledThirdPartyStoragePartitioning()
-              .SerializeForLocalStorage() == serialized_storage_key);
+      assert(maybe_storage_key->SerializeForLocalStorage() ==
+             serialized_storage_key);
     }
   }
   return 0;
diff --git a/third_party/blink/common/storage_key/storage_key_unittest.cc b/third_party/blink/common/storage_key/storage_key_unittest.cc
index 0e82976..f96f6db 100644
--- a/third_party/blink/common/storage_key/storage_key_unittest.cc
+++ b/third_party/blink/common/storage_key/storage_key_unittest.cc
@@ -306,6 +306,9 @@
 
 // Test that deserialized StorageKeys are valid/opaque as expected.
 TEST_F(StorageKeyTest, Deserialize) {
+  base::test::ScopedFeatureList scope_feature_list;
+  scope_feature_list.InitAndEnableFeature(
+      net::features::kThirdPartyStoragePartitioning);
   const struct {
     std::string serialized_string;
     bool expected_has_value;
@@ -587,10 +590,12 @@
     struct {
       const char* serialization;
       absl::optional<blink::StorageKey> expected_key;
+      const bool has_value_if_partitioning_is_disabled;
     } kTestCases[] = {
         {
             "https://example.com/^40^50^6",
             absl::nullopt,
+            false,
         },
         {
             "https://example.com/^41^50^6",
@@ -598,6 +603,7 @@
                 url::Origin::Create(GURL("https://example.com/")),
                 GetOpaqueSite(1ULL, 0ULL, ""),
                 mojom::AncestorChainBit::kCrossSite),
+            false,
         },
         {
             "https://example.com/^40^51^6",
@@ -605,6 +611,7 @@
                 url::Origin::Create(GURL("https://example.com/")),
                 GetOpaqueSite(0ULL, 1ULL, ""),
                 mojom::AncestorChainBit::kCrossSite),
+            false,
         },
         {
             "https://example.com/^41^51^6",
@@ -612,34 +619,47 @@
                 url::Origin::Create(GURL("https://example.com/")),
                 GetOpaqueSite(1ULL, 1ULL, ""),
                 mojom::AncestorChainBit::kCrossSite),
+            false,
         },
         {
             "https://example.com/^10^20",
             absl::nullopt,
+            false,
         },
         {
             "https://example.com/^11^20",
             blink::StorageKey::CreateWithNonce(
                 url::Origin::Create(GURL("https://example.com/")),
                 base::UnguessableToken::CreateForTesting(1ULL, 0ULL)),
+            true,
         },
         {
             "https://example.com/^10^21",
             blink::StorageKey::CreateWithNonce(
                 url::Origin::Create(GURL("https://example.com/")),
                 base::UnguessableToken::CreateForTesting(0ULL, 1ULL)),
+            true,
         },
         {
             "https://example.com/^11^21",
             blink::StorageKey::CreateWithNonce(
                 url::Origin::Create(GURL("https://example.com/")),
                 base::UnguessableToken::CreateForTesting(1ULL, 1ULL)),
+            true,
         },
     };
 
     for (const auto& test : kTestCases) {
       SCOPED_TRACE(test.serialization);
-      EXPECT_EQ(test.expected_key, StorageKey::Deserialize(test.serialization));
+      absl::optional<blink::StorageKey> maybe_storage_key =
+          StorageKey::Deserialize(test.serialization);
+      EXPECT_EQ((test.has_value_if_partitioning_is_disabled || toggle) &&
+                    test.expected_key,
+                (bool)maybe_storage_key);
+      if (maybe_storage_key) {
+        EXPECT_EQ(test.expected_key,
+                  StorageKey::Deserialize(test.serialization));
+      }
     }
   }
 }
@@ -687,7 +707,12 @@
 
     for (const auto& test : kTestCases) {
       SCOPED_TRACE(test.serialization);
-      EXPECT_EQ(test.expected_key, StorageKey::Deserialize(test.serialization));
+      if (toggle) {
+        EXPECT_EQ(test.expected_key,
+                  StorageKey::Deserialize(test.serialization));
+      } else {
+        EXPECT_FALSE(StorageKey::Deserialize(test.serialization));
+      }
     }
   }
 }
@@ -745,8 +770,8 @@
   EXPECT_EQ(net::SchemefulSite(origin2), key_origin1_site2.top_level_site());
 }
 
-// Test that the AncestorChainBit enum class is not reordered and returns
-// kSameSite when partitioning is not enabled.
+// Test that cross-origin keys cannot be deserialized when partitioning is
+// disabled.
 TEST_F(StorageKeyTest, AncestorChainBitGetterWithPartitioningDisabled) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndDisableFeature(
@@ -754,9 +779,7 @@
   std::string cross_site_string = "https://example.com/^0https://test.example";
   absl::optional<StorageKey> key_cross_site =
       StorageKey::Deserialize(cross_site_string);
-  EXPECT_TRUE(key_cross_site.has_value());
-  EXPECT_EQ(mojom::AncestorChainBit::kSameSite,
-            key_cross_site->ancestor_chain_bit());
+  EXPECT_FALSE(key_cross_site.has_value());
 }
 
 // Test that the AncestorChainBit enum class is not reordered and returns the
@@ -1517,4 +1540,63 @@
                      .has_value());
   }
 }
+
+TEST_F(StorageKeyTest,
+       SerializeDeserializeWithAndWithoutThirdPartyStoragePartitioning) {
+  struct {
+    const std::string serialized_key;
+    const bool has_value_if_partitioning_is_disabled;
+  } kTestCases[] = {
+      // This is a valid first-party file key.
+      {
+          "file:///",
+          true,
+      },
+      // This is a valid third-party file key.
+      {
+          "file:///^31",
+          false,
+      },
+      // This is a valid first-party origin key.
+      {
+          "https://example.com/",
+          true,
+      },
+      // This is a valid third-party origin key.
+      {
+          "https://example.com/^31",
+          false,
+      },
+      // This is a valid third-party cross-origin key.
+      {
+          "https://example.com/^0https://notexample.com",
+          false,
+      },
+      // This is a valid nonce key.
+      {
+          "https://example.com/^11^21",
+          true,
+      },
+      // This is a valid opaque top_level_site key.
+      {
+          "https://example.com/^41^51^6",
+          false,
+      },
+  };
+
+  for (const bool toggle : {false, true}) {
+    base::test::ScopedFeatureList scope_feature_list;
+    scope_feature_list.InitWithFeatureState(
+        net::features::kThirdPartyStoragePartitioning, toggle);
+    for (const auto& test_case : kTestCases) {
+      const absl::optional<blink::StorageKey> maybe_storage_key =
+          StorageKey::Deserialize(test_case.serialized_key);
+      EXPECT_EQ(test_case.has_value_if_partitioning_is_disabled || toggle,
+                (bool)maybe_storage_key);
+      if (maybe_storage_key) {
+        EXPECT_EQ(test_case.serialized_key, maybe_storage_key->Serialize());
+      }
+    }
+  }
+}
 }  // namespace blink
diff --git a/third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom b/third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom
index a809c19..99db861 100644
--- a/third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom
+++ b/third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom
@@ -51,12 +51,12 @@
   GetFamilyNames(uint32 family_index)
       => (array<DWriteStringPair> out_family_names);
 
-  // Returns the list of font file paths in the system font directory that
-  // contain font data for the font family at the specified index.
+  // Returns the list of font file handles in the system font directory and
+  // other locations that contain font data for the font family at the specified
+  // index.
   [Sync]
-  GetFontFiles(uint32 family_index)
-     => (array<mojo_base.mojom.FilePath> file_paths,
-         array<mojo_base.mojom.ReadOnlyFile> file_handles);
+  GetFontFileHandles(uint32 family_index)
+     => (array<mojo_base.mojom.ReadOnlyFile> file_handles);
 
   // Matches a unique PostScript or full font name against the installed fonts
   // using DirectWrite API. Returns a pre-opened file handle and ttc_index from
diff --git a/third_party/blink/renderer/bindings/scripts/utilities.py b/third_party/blink/renderer/bindings/scripts/utilities.py
index 7d27e62..2e6669d 100644
--- a/third_party/blink/renderer/bindings/scripts/utilities.py
+++ b/third_party/blink/renderer/bindings/scripts/utilities.py
@@ -271,13 +271,13 @@
 
 
 def get_file_contents(filename):
-    with open(filename) as f:
+    with open(filename, encoding='utf-8') as f:
         return f.read()
 
 
 def read_file_to_list(filename):
     """Returns a list of (stripped) lines for a given filename."""
-    with open(filename) as f:
+    with open(filename, encoding='utf-8') as f:
         return [line.rstrip('\n') for line in f]
 
 
@@ -302,7 +302,7 @@
 
 def read_idl_files_list_from_file(filename):
     """Similar to read_file_to_list, but also resolves cygpath."""
-    with open(filename) as input_file:
+    with open(filename, encoding='utf-8') as input_file:
         file_names = sorted(shlex.split(input_file))
         idl_file_names = [
             file_name for file_name in file_names
@@ -329,7 +329,7 @@
 def write_file(new_text, destination_filename):
     # If |new_text| is same with the file content, we skip updating.
     if os.path.isfile(destination_filename):
-        with open(destination_filename) as destination_file:
+        with open(destination_filename, encoding='utf-8') as destination_file:
             if destination_file.read() == new_text:
                 return
 
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.cc b/third_party/blink/renderer/core/animation/animation_timeline.cc
index 42337020..e4dc23a9 100644
--- a/third_party/blink/renderer/core/animation/animation_timeline.cc
+++ b/third_party/blink/renderer/core/animation/animation_timeline.cc
@@ -150,7 +150,7 @@
     if (!animation->IsReplaceable())
       continue;
     DCHECK(animation->effect());
-    Element* target = To<KeyframeEffect>(animation->effect())->target();
+    Element* target = To<KeyframeEffect>(animation->effect())->EffectTarget();
     DCHECK(target);
     if (target->GetDocument() != animation->GetDocument())
       continue;
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
index 8513033..df4178fe 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -1430,21 +1430,44 @@
     return ordered_named_grid_lines_.empty() &&
            ordered_named_auto_repeat_grid_lines_.empty();
   }
+  bool IsSubgriddedAxis() const { return is_subgridded_axis_; }
+  wtf_size_t InsertionPoint() const { return insertion_point_; }
+  bool HasAutoRepeatNamedLinesSpecified() const {
+    return ordered_named_auto_repeat_grid_lines_.size() > 0;
+  }
+  // A collapsed auto repeat track is a specified auto-repeat track that was
+  // clamped to zero repeats. This can only happen for subgrids, as
+  // standalone grids guarantee a minimum of 1 repeat.
+  bool HasCollapsedAutoRepeatNamedLines() const {
+    return IsSubgriddedAxis() && HasAutoRepeatNamedLinesSpecified() &&
+           auto_repeat_total_tracks_ == 0;
+  }
   virtual void CollectLineNamesForIndex(
       cssvalue::CSSBracketedValueList&,
-      size_t index,
+      wtf_size_t index,
       GridTrackListSerializationType named_line_type = kForGridElements) const;
 
  protected:
   enum NamedLinesType { kNamedLines, kAutoRepeatNamedLines };
   void AppendLines(
       cssvalue::CSSBracketedValueList&,
-      size_t index,
+      wtf_size_t index,
       NamedLinesType,
       GridTrackListSerializationType named_line_type = kForGridElements) const;
 
   const OrderedNamedGridLines& ordered_named_grid_lines_;
   const OrderedNamedGridLines& ordered_named_auto_repeat_grid_lines_;
+  // The auto-repeat index.
+  wtf_size_t insertion_point_{0};
+  // The total number of auto-repeat tracks, factoring in the number of
+  // repetitions (e.g. `repeat(auto-fit, [a][b])` with `auto-fit` calculated at
+  // 3 repetitions would be 6).
+  wtf_size_t auto_repeat_total_tracks_{0};
+  // The size of one auto repeat track (e.g. `repeat(auto-fit, [a][b])` has an
+  // auto repeat track list length of 2, regardless of the number of repetitions
+  // computed for `auto-fit`).
+  wtf_size_t auto_repeat_track_list_length_{0};
+  bool is_subgridded_axis_{false};
 };
 
 class OrderedNamedLinesCollectorInsideAutoRepeat
@@ -1456,7 +1479,7 @@
       : OrderedNamedLinesCollector(ordered_named_grid_lines,
                                    ordered_named_auto_repeat_grid_lines) {}
   void CollectLineNamesForIndex(cssvalue::CSSBracketedValueList&,
-                                size_t index,
+                                wtf_size_t index,
                                 GridTrackListSerializationType named_line_type =
                                     kForGridElements) const override;
 };
@@ -1467,29 +1490,26 @@
   OrderedNamedLinesCollectorInGridLayout(
       const OrderedNamedGridLines& ordered_named_grid_lines,
       const OrderedNamedGridLines& ordered_named_auto_repeat_grid_lines,
-      size_t insertion_point,
-      size_t auto_repeat_tracks_count,
-      size_t auto_repeat_track_list_length)
+      wtf_size_t insertion_point,
+      wtf_size_t auto_repeat_total_tracks,
+      wtf_size_t auto_repeat_track_list_length,
+      bool is_subgridded_axis = false)
       : OrderedNamedLinesCollector(ordered_named_grid_lines,
-                                   ordered_named_auto_repeat_grid_lines),
-        insertion_point_(insertion_point),
-        auto_repeat_total_tracks_(auto_repeat_tracks_count),
-        auto_repeat_track_list_length_(auto_repeat_track_list_length) {}
+                                   ordered_named_auto_repeat_grid_lines) {
+    insertion_point_ = insertion_point;
+    is_subgridded_axis_ = is_subgridded_axis;
+    auto_repeat_total_tracks_ = auto_repeat_total_tracks;
+    auto_repeat_track_list_length_ = auto_repeat_track_list_length;
+  }
   void CollectLineNamesForIndex(cssvalue::CSSBracketedValueList&,
-                                size_t index,
+                                wtf_size_t index,
                                 GridTrackListSerializationType named_line_type =
                                     kForGridElements) const override;
-
- private:
-  size_t insertion_point_;
-  size_t auto_repeat_total_tracks_;
-  size_t auto_repeat_track_list_length_;
 };
 
-// RJW
 void OrderedNamedLinesCollector::AppendLines(
     cssvalue::CSSBracketedValueList& line_names_value,
-    size_t index,
+    wtf_size_t index,
     NamedLinesType type,
     GridTrackListSerializationType named_line_type) const {
   auto iter = type == kNamedLines
@@ -1523,45 +1543,50 @@
 
 void OrderedNamedLinesCollector::CollectLineNamesForIndex(
     cssvalue::CSSBracketedValueList& line_names_value,
-    size_t i,
+    wtf_size_t i,
     GridTrackListSerializationType named_line_type) const {
-  DCHECK(!IsEmpty());
+  DCHECK(IsSubgriddedAxis() || !IsEmpty());
   AppendLines(line_names_value, i, kNamedLines, named_line_type);
 }
 
 void OrderedNamedLinesCollectorInsideAutoRepeat::CollectLineNamesForIndex(
     cssvalue::CSSBracketedValueList& line_names_value,
-    size_t i,
+    wtf_size_t i,
     GridTrackListSerializationType named_line_type) const {
-  DCHECK(!IsEmpty());
+  DCHECK(IsSubgriddedAxis() || !IsEmpty());
   AppendLines(line_names_value, i, kAutoRepeatNamedLines);
 }
 
-// RJW
 void OrderedNamedLinesCollectorInGridLayout::CollectLineNamesForIndex(
     cssvalue::CSSBracketedValueList& line_names_value,
-    size_t i,
+    wtf_size_t i,
     GridTrackListSerializationType named_line_type) const {
-  DCHECK(!IsEmpty());
-  if (auto_repeat_track_list_length_ == 0LU || i < insertion_point_) {
+  DCHECK(IsSubgriddedAxis() || !IsEmpty());
+
+  // Handle lines before the auto repeat insertion point. If we don't have any
+  // auto repeat tracks, we can skip all of the auto repeat logic below.
+  if (auto_repeat_total_tracks_ == 0LU || i < insertion_point_) {
     AppendLines(line_names_value, i, kNamedLines);
     return;
   }
 
   DCHECK(auto_repeat_total_tracks_);
 
+  // Handle tracks after the auto repeaters.
   if (i > insertion_point_ + auto_repeat_total_tracks_) {
     AppendLines(line_names_value, i - (auto_repeat_total_tracks_ - 1),
                 kNamedLines);
     return;
   }
 
+  // Handle the auto repeat track at the insertion point.
   if (i == insertion_point_) {
     AppendLines(line_names_value, i, kNamedLines);
     AppendLines(line_names_value, 0, kAutoRepeatNamedLines);
     return;
   }
 
+  // Handle the final auto repeat track.
   if (i == insertion_point_ + auto_repeat_total_tracks_) {
     AppendLines(line_names_value, auto_repeat_track_list_length_,
                 kAutoRepeatNamedLines);
@@ -1569,7 +1594,8 @@
     return;
   }
 
-  size_t auto_repeat_index_in_first_repetition =
+  // Handle tracks in the auto repeat range.
+  wtf_size_t auto_repeat_index_in_first_repetition =
       (i - insertion_point_) % auto_repeat_track_list_length_;
   if (!auto_repeat_index_in_first_repetition && i > insertion_point_) {
     AppendLines(line_names_value, auto_repeat_track_list_length_,
@@ -1581,16 +1607,25 @@
 
 void AddValuesForNamedGridLinesAtIndex(
     OrderedNamedLinesCollector& collector,
-    size_t i,
+    wtf_size_t i,
     CSSValueList& list,
     GridTrackListSerializationType named_line_type = kForGridElements) {
-  if (collector.IsEmpty()) {
+  if (collector.IsSubgriddedAxis()) {
+    // Skip collapsed lines at the auto repeat insertion point.
+    if (i == collector.InsertionPoint() &&
+        collector.HasCollapsedAutoRepeatNamedLines()) {
+      return;
+    }
+  } else if (collector.IsEmpty()) {
     return;
   }
 
   auto* line_names = MakeGarbageCollected<cssvalue::CSSBracketedValueList>();
   collector.CollectLineNamesForIndex(*line_names, i, named_line_type);
-  if (line_names->length()) {
+
+  // Subgridded track listings include empty lines per
+  // https://www.w3.org/TR/css-grid-2/#resolved-track-list-subgrid.
+  if (line_names->length() || collector.IsSubgriddedAxis()) {
     list.Append(*line_names);
   }
 }
@@ -1626,34 +1661,38 @@
 void PopulateGridTrackList(CSSValueList* list,
                            OrderedNamedLinesCollector& collector,
                            const Vector<T, 1>& tracks,
-                           F getTrackSize,
+                           F GetTrackSize,
                            wtf_size_t start,
                            wtf_size_t end,
-                           int offset = 0) {
+                           int offset) {
   DCHECK_LE(start, end);
-  DCHECK_LE(end, tracks.size());
-
+  if (collector.HasCollapsedAutoRepeatNamedLines()) {
+    // If the collector has a collapsed auto-repeat track, we need to adjust
+    // `end` to account for it, as `AddValuesForNamedGridLinesAtIndex` expects
+    // `insertion_point` to consume one track. Since there can only be one
+    // auto-repeat track, this will always need to be incremented by one.
+    if (collector.InsertionPoint() < end) {
+      ++end;
+    }
+  }
   for (wtf_size_t i = start; i < end; ++i) {
     if (offset >= 0 || i >= static_cast<wtf_size_t>(-offset)) {
       AddValuesForNamedGridLinesAtIndex(collector, i + offset, *list);
     }
-    list->Append(*getTrackSize(tracks[i]));
+    // Subgrids do not include sizes in the track listing.
+    if (!collector.IsSubgriddedAxis()) {
+      DCHECK_LE(i, tracks.size());
+      list->Append(*GetTrackSize(tracks[i]));
+    }
   }
-  if (offset >= 0 || end >= static_cast<wtf_size_t>(-offset)) {
+  // Subgrid track names are always relative to offset 0, so they can ignore the
+  // tracks after the offset.
+  if (!collector.IsSubgriddedAxis() &&
+      (offset >= 0 || end >= static_cast<wtf_size_t>(-offset))) {
     AddValuesForNamedGridLinesAtIndex(collector, end + offset, *list);
   }
 }
 
-template <typename T, typename F>
-void PopulateGridTrackList(CSSValueList* list,
-                           OrderedNamedLinesCollector& collector,
-                           const Vector<T, 1>& tracks,
-                           F getTrackSize,
-                           int offset = 0) {
-  PopulateGridTrackList<T>(list, collector, tracks, getTrackSize, 0,
-                           tracks.size(), offset);
-}
-
 CSSValue* ComputedStyleUtils::ValueForGridTrackList(
     GridTrackSizingDirection direction,
     const LayoutObject* layout_object,
@@ -1690,66 +1729,63 @@
   CSSValueList* list = CSSValueList::CreateSpaceSeparated();
   wtf_size_t auto_repeat_insertion_point =
       computed_grid_track_list.auto_repeat_insertion_point;
+  const bool is_subgrid = computed_grid_track_list.IsSubgriddedAxis();
 
   if (is_layout_grid) {
     const auto* grid = ToInterface<LayoutNGGridInterface>(layout_object);
-    if (computed_grid_track_list.IsSubgriddedAxis()) {
-      // If the track list is subgridded, return the word 'subgrid', followed by
-      // the specified named grid lines in brackets. Empty brackets are also
-      // valid.
+
+    // The number of auto repeat tracks. For 'repeat(auto-fill, [x][y])' this
+    // will be 2, regardless of what auto-fill computes to. For subgrids, use
+    // the number of grid line names specified on the track definition. For
+    // standalone grids, this will be the number of track sizes, as this can
+    // can differ from the count on the track definition.
+    wtf_size_t auto_repeat_track_list_length =
+        computed_grid_track_list.TrackList().AutoRepeatTrackCount();
+
+    // Standalone grids will report the track sizes in the computed style
+    // string, so base the start and end indices on it.
+    auto track_sizes = grid->TrackSizesForComputedStyle(direction);
+    wtf_size_t start_index = 0;
+    wtf_size_t end_index = track_sizes.size();
+    if (is_subgrid) {
       list->Append(
           *MakeGarbageCollected<CSSIdentifierValue>(CSSValueID::kSubgrid));
 
-      wtf_size_t subgrid_line_names_start =
-          grid->ExplicitGridStartForDirection(direction);
-      wtf_size_t subgrid_line_names_end =
-          grid->ExplicitGridEndForDirection(direction);
-      for (wtf_size_t i = subgrid_line_names_start; i <= subgrid_line_names_end;
-           ++i) {
-        auto iter = computed_grid_track_list.ordered_named_grid_lines.find(i);
-
-        cssvalue::CSSBracketedValueList* value_list =
-            MakeGarbageCollected<cssvalue::CSSBracketedValueList>();
-
-        if (iter != computed_grid_track_list.ordered_named_grid_lines.end()) {
-          for (auto named_grid_line : iter->value) {
-            value_list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
-                named_grid_line.line_name));
-          }
-        }
-        list->Append(*value_list);
-      }
-      return list;
-    } else {
-      // If the element is a grid container, the resolved value is the used
-      // value, specifying track sizes in pixels and expanding the repeat()
-      // notation.
-      OrderedNamedLinesCollectorInGridLayout collector(
-          computed_grid_track_list.ordered_named_grid_lines,
-          computed_grid_track_list.auto_repeat_ordered_named_grid_lines,
-          auto_repeat_insertion_point,
-          grid->AutoRepeatCountForDirection(direction),
-          auto_repeat_track_sizes.size());
-      auto getTrackSize = [&](const LayoutUnit& v) {
-        return ZoomAdjustedPixelValue(v, style);
-      };
-      // Named grid line indices are relative to the explicit grid, but we are
-      // including all tracks. So we need to subtract the number of leading
-      // implicit tracks in order to get the proper line index.
-      int offset = -base::checked_cast<int>(
-          grid->ExplicitGridStartForDirection(direction));
-      PopulateGridTrackList(list, collector,
-                            grid->TrackSizesForComputedStyle(direction),
-                            getTrackSize, offset);
-      return list;
+      // For subgrids, track sizes are not supported. Instead, calculate the end
+      // index by subtracting the grid end from its start.
+      start_index = grid->ExplicitGridStartForDirection(direction);
+      end_index = grid->ExplicitGridEndForDirection(direction) -
+                  grid->ExplicitGridStartForDirection(direction) + 1;
     }
+    // If the element is a grid container, the resolved value is the used value,
+    // specifying track sizes in pixels (if it's a standalone grid), and
+    // expanding the repeat() notation.
+    OrderedNamedLinesCollectorInGridLayout collector(
+        computed_grid_track_list.ordered_named_grid_lines,
+        computed_grid_track_list.auto_repeat_ordered_named_grid_lines,
+        auto_repeat_insertion_point,
+        grid->AutoRepeatCountForDirection(direction),
+        auto_repeat_track_list_length, is_subgrid);
+    auto GetTrackSize = [&](const LayoutUnit& v) {
+      return ZoomAdjustedPixelValue(v, style);
+    };
+    // Named grid line indices are relative to the explicit grid, but we are
+    // including all tracks. So we need to subtract the number of leading
+    // implicit tracks in order to get the proper line index. This is ignored
+    // for subgrids because they only have explicit tracks.
+    int offset = -base::checked_cast<int>(
+        grid->ExplicitGridStartForDirection(direction));
+
+    PopulateGridTrackList(list, collector, track_sizes, GetTrackSize,
+                          start_index, end_index, offset);
+    return list;
   }
 
   // Otherwise, the resolved value is the computed value, preserving repeat().
   OrderedNamedLinesCollector collector(
       computed_grid_track_list.ordered_named_grid_lines,
       computed_grid_track_list.auto_repeat_ordered_named_grid_lines);
-  auto getTrackSize = [&](const GridTrackSize& v) {
+  auto GetTrackSize = [&](const GridTrackSize& v) {
     return SpecifiedValueForGridTrackSize(v, style);
   };
 
@@ -1761,7 +1797,7 @@
                             GridTrackListSerializationType named_line_type) {
       AddValuesForNamedGridLinesAtIndex(collector, track_index, *list,
                                         named_line_type);
-      list->Append(*getTrackSize(track_size));
+      list->Append(*GetTrackSize(track_size));
       ++track_index;
     };
 
@@ -1776,8 +1812,15 @@
         continue;
       }
 
-      // Add a CSSGridIntegerRepeatValue with the contents of the repeat().
+      // If a subgridded axis was specified, but the element is not part of a
+      // parent grid, only integer repeats are supported.
+      if (computed_grid_track_list.IsSubgriddedAxis() &&
+          repeat_type != NGGridTrackRepeater::RepeatType::kInteger) {
+        continue;
+      }
       DCHECK_EQ(repeat_type, NGGridTrackRepeater::RepeatType::kInteger);
+
+      // Add a CSSGridIntegerRepeatValue with the contents of the repeat().
       const wtf_size_t number_of_repetitions = ng_track_list.RepeatCount(i, 0);
       const wtf_size_t repeat_size = ng_track_list.RepeatSize(i);
       CSSValueList* repeated_values =
@@ -1801,8 +1844,9 @@
     return list;
   }
   // Add the line names and track sizes that precede the auto repeat().
-  PopulateGridTrackList(list, collector, legacy_track_sizes, getTrackSize, 0,
-                        auto_repeat_insertion_point);
+  PopulateGridTrackList(list, collector, legacy_track_sizes, GetTrackSize,
+                        /* start */ 0,
+                        /* end */ auto_repeat_insertion_point, /* offset */ 0);
 
   // Add a CSSGridAutoRepeatValue with the contents of the auto repeat().
   CSSValueList* repeated_values =
@@ -1814,13 +1858,15 @@
       computed_grid_track_list.ordered_named_grid_lines,
       computed_grid_track_list.auto_repeat_ordered_named_grid_lines);
   PopulateGridTrackList(repeated_values, repeat_collector,
-                        auto_repeat_track_sizes, getTrackSize);
+                        auto_repeat_track_sizes, GetTrackSize, /* start */ 0,
+                        /* end */ auto_repeat_track_sizes.size(),
+                        /* offset */ 0);
   list->Append(*repeated_values);
 
   // Add the line names and track sizes that follow the auto repeat().
-  PopulateGridTrackList(list, collector, legacy_track_sizes, getTrackSize,
-                        auto_repeat_insertion_point, legacy_track_sizes.size(),
-                        1);
+  PopulateGridTrackList(list, collector, legacy_track_sizes, GetTrackSize,
+                        /* start */ auto_repeat_insertion_point,
+                        /* end */ legacy_track_sizes.size(), /* offset */ 1);
   return list;
 }
 
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index 01d6e27a..c97aa38 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -1306,6 +1306,7 @@
     if (identifier_value &&
         identifier_value->GetValueID() == CSSValueID::kSubgrid) {
       computed_grid_track_list.axis_type = GridAxisType::kSubgriddedAxis;
+      track_sizes.NGTrackList().SetAxisType(GridAxisType::kSubgriddedAxis);
       ++curr_value;
     }
   }
@@ -1337,8 +1338,11 @@
             ConvertGridTrackSize(state, *auto_repeat_value));
       }
       track_sizes.NGTrackList().AddRepeater(
-          repeated_track_sizes, static_cast<NGGridTrackRepeater::RepeatType>(
-                                    computed_grid_track_list.auto_repeat_type));
+          repeated_track_sizes,
+          static_cast<NGGridTrackRepeater::RepeatType>(
+              computed_grid_track_list.auto_repeat_type),
+          /* repeat_count */ 1,
+          /* repeat_number_of_lines */ auto_repeat_index);
       DCHECK(auto_repeat_track_sizes.empty());
       auto_repeat_track_sizes = std::move(repeated_track_sizes);
       computed_grid_track_list.auto_repeat_insertion_point =
diff --git a/third_party/blink/renderer/core/dom/live_node_list_base.h b/third_party/blink/renderer/core/dom/live_node_list_base.h
index 5620418..bbc463c 100644
--- a/third_party/blink/renderer/core/dom/live_node_list_base.h
+++ b/third_party/blink/renderer/core/dom/live_node_list_base.h
@@ -132,9 +132,8 @@
       return attr_name == html_names::kHrefAttr;
     case kInvalidateOnPopoverInvokerAttrChange:
       return attr_name == html_names::kPopoverAttr ||
-             attr_name == html_names::kPopovertoggletargetAttr ||
-             attr_name == html_names::kPopoverhidetargetAttr ||
-             attr_name == html_names::kPopovershowtargetAttr;
+             attr_name == html_names::kPopovertargetAttr ||
+             attr_name == html_names::kPopovertargetactionAttr;
     case kDoNotInvalidateOnAttributeChanges:
       return false;
     case kInvalidateOnAnyAttrChange:
diff --git a/third_party/blink/renderer/core/dom/popup_target_element.idl b/third_party/blink/renderer/core/dom/popup_target_element.idl
index b292563..66813df 100644
--- a/third_party/blink/renderer/core/dom/popup_target_element.idl
+++ b/third_party/blink/renderer/core/dom/popup_target_element.idl
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 interface mixin PopoverTargetElement {
-  [CEReactions,RuntimeEnabled=HTMLPopoverAttribute,Reflect=popovertoggletarget] attribute Element? popoverToggleTargetElement;
-  [CEReactions,RuntimeEnabled=HTMLPopoverAttribute,Reflect=popoverhidetarget] attribute Element? popoverHideTargetElement;
-  [CEReactions,RuntimeEnabled=HTMLPopoverAttribute,Reflect=popovershowtarget] attribute Element? popoverShowTargetElement;
+  [CEReactions,RuntimeEnabled=HTMLPopoverAttribute,Reflect=popovertarget] attribute Element? popoverTargetElement;
+  [CEReactions,RuntimeEnabled=HTMLPopoverAttribute,Reflect,ReflectOnly=("toggle","show","hide"),ReflectEmpty="toggle",ReflectInvalid="toggle",ReflectMissing="toggle"] attribute DOMString popoverTargetAction;
 };
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5 b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
index 79999bcf..16275bb 100644
--- a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
+++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
@@ -521,26 +521,6 @@
       milestone: 96,
     },
     {
-      name: "WindowPlacementPermissionDescriptorUsed",
-      message: "The permission descriptor `window-placement` is deprecated. Use `window-management` instead. For more help, check https://bit.ly/window-placement-rename.",
-      translation_note: "A deprecation warning shown in the DevTools Issues tab. 'window-placement' and 'window-management' are the name of the javascript descriptors (do not translate). The warning is shown when web pages attempt to use 'window-placement' in permission APIs (e.g. navigator.permissions.query(...))",
-      web_features: [
-        "kWindowPlacementPermissionDescriptorUsed",
-      ],
-      milestone: 112,
-      chrome_status_feature: 5137018030391296,
-    },
-    {
-      name: "WindowPlacementPermissionPolicyParsed",
-      message: "The permission policy `window-placement` is deprecated. Use `window-management` instead. For more help, check https://bit.ly/window-placement-rename.",
-      translation_note: "A deprecation warning shown in the DevTools Issues tab. 'window-placement' and 'window-management' are the name of the policy descriptors (do not translate). The warning is shown when web pages attempt to use 'window-placement' as a permission policy (parsed in iframe or header).",
-      web_features: [
-        "kWindowPlacementPermissionPolicyParsed",
-      ],
-      milestone: 112,
-      chrome_status_feature: 5137018030391296,
-    },
-    {
       name: "XHRJSONEncodingDetection",
       message: "UTF-16 is not supported by response json in `XMLHttpRequest`",
       translation_note: "Warning displayed to developers that they are using `XMLHttpRequest` API in a way that they expect an unsupported character encoding `UTF-16` could be used in the server reply.",
diff --git a/third_party/blink/renderer/core/html/forms/file_chooser.cc b/third_party/blink/renderer/core/html/forms/file_chooser.cc
index 730ca8c..51ac05a 100644
--- a/third_party/blink/renderer/core/html/forms/file_chooser.cc
+++ b/third_party/blink/renderer/core/html/forms/file_chooser.cc
@@ -110,34 +110,11 @@
 }
 
 void FileChooser::DidChooseFiles(mojom::blink::FileChooserResultPtr result) {
-  // TODO(tkent): If |result| is nullptr, we should not clear the
+  // TODO(crbug.com/1418799): If |result| is nullptr, we should not clear the
   // already-selected files in <input type=file> like other browsers.
   FileChooserFileInfoList files;
   if (result)
     files = std::move(result->files);
-  // FIXME: This is inelegant. We should not be looking at params_ here.
-  if (params_->selected_files.size() == files.size()) {
-    bool was_changed = false;
-    for (unsigned i = 0; i < files.size(); ++i) {
-      // TODO(tkent): If a file system URL was already selected, and new
-      // chooser session selects the same one, a |change| event is
-      // dispatched unexpectedly.
-      // |selected_files| is created by FileList::
-      // PathsForUserVisibleFiles(), and it returns File::name() for
-      // file system URLs. Comparing File::name() doesn't make
-      // sense. We should compare file system URLs.
-      if (!files[i]->is_native_file() ||
-          params_->selected_files[i] !=
-              files[i]->get_native_file()->file_path) {
-        was_changed = true;
-        break;
-      }
-    }
-    if (!was_changed) {
-      DidCloseChooser();
-      return;
-    }
-  }
 
   if (client_) {
     client_->FilesChosen(std::move(files),
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.cc b/third_party/blink/renderer/core/html/forms/file_input_type.cc
index 3bd5fbc..e698265 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/file_input_type.cc
@@ -423,8 +423,11 @@
     GetElement().DispatchInputEvent();
     GetElement().DispatchChangeEvent();
     if (AXObjectCache* cache =
-            GetElement().GetDocument().ExistingAXObjectCache())
+            GetElement().GetDocument().ExistingAXObjectCache()) {
       cache->HandleValueChanged(&GetElement());
+    }
+  } else {
+    GetElement().DispatchCancelEvent();
   }
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
index 49a8271e..5e2ad55 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
+++ b/third_party/blink/renderer/core/html/forms/file_input_type_test.cc
@@ -21,6 +21,7 @@
 #include "third_party/blink/renderer/core/page/drag_data.h"
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
+#include "third_party/blink/renderer/core/testing/wait_for_event.h"
 #include "third_party/blink/renderer/platform/file_metadata.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/date_math.h"
@@ -29,6 +30,13 @@
 
 namespace {
 
+class MockEventListener final : public NativeEventListener {
+ public:
+  bool invoked = false;
+  void Invoke(ExecutionContext*, Event*) override { invoked = true; }
+  void ClearInvoked() { invoked = false; }
+};
+
 class WebKitDirectoryChromeClient : public EmptyChromeClient {
  public:
   void RegisterPopupOpeningObserver(PopupOpeningObserver*) override {
@@ -238,4 +246,195 @@
       input.UserAgentShadowRoot()->firstChild()->firstChild()));
 }
 
+// Tests selecting same file twice should fire cancel event second time.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsForSameFile) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  auto reset = [&] {
+    listener_change->ClearInvoked();
+    listener_cancel->ClearInvoked();
+  };
+
+  auto* const selection_1 = MakeGarbageCollected<FileList>();
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_1);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+
+  reset();
+  auto* const selection_2 = MakeGarbageCollected<FileList>();
+  selection_2->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_2);
+  EXPECT_FALSE(listener_change->invoked);
+  EXPECT_TRUE(listener_cancel->invoked);
+}
+
+// Tests selecting same files twice should fire cancel event second time.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsForSameFiles) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  input->SetBooleanAttribute(html_names::kMultipleAttr, true);
+  auto reset = [&] {
+    listener_change->ClearInvoked();
+    listener_cancel->ClearInvoked();
+  };
+
+  auto* const selection_1 = MakeGarbageCollected<FileList>();
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/B.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_1);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+
+  reset();
+  auto* const selection_2 = MakeGarbageCollected<FileList>();
+  selection_2->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  selection_2->Append(MakeGarbageCollected<File>("/path/to/B.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_2);
+  EXPECT_FALSE(listener_change->invoked);
+  EXPECT_TRUE(listener_cancel->invoked);
+}
+
+// Tests selecting different file after first selection should fire change
+// event.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsForDifferentFile) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  auto reset = [&] {
+    listener_change->ClearInvoked();
+    listener_cancel->ClearInvoked();
+  };
+
+  auto* const selection_1 = MakeGarbageCollected<FileList>();
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_1);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+
+  reset();
+  auto* const selection_2 = MakeGarbageCollected<FileList>();
+  selection_2->Append(MakeGarbageCollected<File>("/path/to/B.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_2);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+}
+
+// Tests selecting different files after first selection should fire change
+// event.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsForDifferentFiles) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  input->SetBooleanAttribute(html_names::kMultipleAttr, true);
+  auto reset = [&] {
+    listener_change->ClearInvoked();
+    listener_cancel->ClearInvoked();
+  };
+
+  auto* const selection_1 = MakeGarbageCollected<FileList>();
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/B.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_1);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+
+  reset();
+  auto* const selection_2 = MakeGarbageCollected<FileList>();
+  selection_2->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_2);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+}
+
+// Tests clearing selection (click cancel in file chooser) after selection
+// should fire change event.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsCancelWithSelection) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  input->SetBooleanAttribute(html_names::kMultipleAttr, true);
+  auto reset = [&] {
+    listener_change->ClearInvoked();
+    listener_cancel->ClearInvoked();
+  };
+
+  auto* const selection_1 = MakeGarbageCollected<FileList>();
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/A.txt"));
+  selection_1->Append(MakeGarbageCollected<File>("/path/to/B.txt"));
+  file_input->SetFilesAndDispatchEvents(selection_1);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+
+  reset();
+  auto* const selection_2 = MakeGarbageCollected<FileList>();
+  file_input->SetFilesAndDispatchEvents(selection_2);
+  EXPECT_TRUE(listener_change->invoked);
+  EXPECT_FALSE(listener_cancel->invoked);
+}
+
+// Tests clearing selection (click cancel in file chooser) without selection
+// should fire cancel event.
+TEST(FileInputTypeTest, SetFilesFireCorrectEventsCancelWithoutSelection) {
+  ScopedNullExecutionContext execution_context;
+
+  auto* document =
+      Document::CreateForTest(execution_context.GetExecutionContext());
+  auto* input =
+      MakeGarbageCollected<HTMLInputElement>(*document, CreateElementFlags());
+  InputType* file_input = MakeGarbageCollected<FileInputType>(*input);
+  auto* listener_change = MakeGarbageCollected<MockEventListener>();
+  auto* listener_cancel = MakeGarbageCollected<MockEventListener>();
+  input->addEventListener(event_type_names::kChange, listener_change);
+  input->addEventListener(event_type_names::kCancel, listener_cancel);
+  input->SetBooleanAttribute(html_names::kMultipleAttr, true);
+
+  auto* const selection = MakeGarbageCollected<FileList>();
+  file_input->SetFilesAndDispatchEvents(selection);
+  EXPECT_FALSE(listener_change->invoked);
+  EXPECT_TRUE(listener_cancel->invoked);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 159f09e..f333ab8 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -324,21 +324,15 @@
   return CanBeSuccessfulSubmitButton() && !IsDisabledFormControl();
 }
 
-// The element is returned if a) that element exists, b) it is a valid Popover
-// element, and c) this form control supports popover triggering. If multiple
-// toggle attributes are present:
-//  1. Only one idref will ever be used, if multiple attributes are present.
-//  2. If 'popovertoggletarget' is present, its IDREF will be used.
-//  3. If 'popovershowtarget' is present and 'popovertoggletarget' isn't present
-//     or its value doesn't match that of popovershowtarget, only
-//     popovershowtarget will be used.
-//  4. If both 'popovershowtarget' and 'popoverhidetarget' are present and their
-//     values match, the behavior is to toggle.
+// The element referenced by the `popovertarget` attribute is returned if a)
+// that element exists, b) it is a valid Popover element, and c) this form
+// control supports popover triggering. The return value will include the
+// behavior, which is taken from the `popovertargetaction` attribute, and will
+// be kNone unless there is a valid popover target.
 HTMLFormControlElement::PopoverTargetElement
 HTMLFormControlElement::popoverTargetElement() {
   const PopoverTargetElement no_element{.popover = nullptr,
-                                        .action = PopoverTriggerAction::kNone,
-                                        .attribute_name = g_null_name};
+                                        .action = PopoverTriggerAction::kNone};
   if (!RuntimeEnabledFeatures::HTMLPopoverAttributeEnabled(
           GetDocument().GetExecutionContext()) ||
       !IsInTreeScope() ||
@@ -348,27 +342,7 @@
   }
 
   Element* target_element;
-  QualifiedName attribute_name = html_names::kPopovertoggletargetAttr;
-  PopoverTriggerAction action = PopoverTriggerAction::kToggle;
-  target_element = GetElementAttribute(html_names::kPopovertoggletargetAttr);
-  if (!target_element) {
-    target_element = GetElementAttribute(html_names::kPopovershowtargetAttr);
-    if (target_element) {
-      action = PopoverTriggerAction::kShow;
-      attribute_name = html_names::kPopovershowtargetAttr;
-    }
-  }
-  if (Element* hide_target =
-          GetElementAttribute(html_names::kPopoverhidetargetAttr)) {
-    if (!target_element) {
-      target_element = hide_target;
-      action = PopoverTriggerAction::kHide;
-      attribute_name = html_names::kPopoverhidetargetAttr;
-    } else if (hide_target == target_element) {
-      action = PopoverTriggerAction::kToggle;
-      // Leave attribute_name as-is in this case.
-    }
-  }
+  target_element = GetElementAttribute(html_names::kPopovertargetAttr);
   if (!target_element) {
     return no_element;
   }
@@ -376,9 +350,16 @@
   if (!target_popover || !target_popover->HasPopoverAttribute()) {
     return no_element;
   }
-  return PopoverTargetElement{.popover = target_popover,
-                              .action = action,
-                              .attribute_name = attribute_name};
+  // The default action is "toggle".
+  PopoverTriggerAction action = PopoverTriggerAction::kToggle;
+  auto action_value =
+      getAttribute(html_names::kPopovertargetactionAttr).LowerASCII();
+  if (action_value == "show") {
+    action = PopoverTriggerAction::kShow;
+  } else if (action_value == "hide") {
+    action = PopoverTriggerAction::kHide;
+  }
+  return PopoverTargetElement{.popover = target_popover, .action = action};
 }
 
 void HTMLFormControlElement::DefaultEventHandler(Event& event) {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index df2e64e6..79596686 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -93,7 +93,6 @@
     DISALLOW_NEW();
     WeakMember<HTMLElement> popover;
     PopoverTriggerAction action;
-    QualifiedName attribute_name;
     void Trace(Visitor* visitor) const { visitor->Trace(popover); }
   };
 
@@ -102,9 +101,7 @@
     kSupported,
   };
 
-  // Retrieves the element pointed to by 'popovertoggletarget',
-  // 'popovershowtarget', and/or 'popoverhidetarget' content attributes, if any,
-  // and only if this form control element supports popover triggering.
+  // Retrieves the popover target element and triggering behavior.
   PopoverTargetElement popoverTargetElement();
   virtual PopoverTriggerSupport SupportsPopoverTriggering() const {
     return PopoverTriggerSupport::kNone;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
index da9088713..e5ea049 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.cc
@@ -334,6 +334,10 @@
   DispatchScopedEvent(*Event::CreateBubble(event_type_names::kChange));
 }
 
+void HTMLFormControlElementWithState::DispatchCancelEvent() {
+  DispatchScopedEvent(*Event::CreateBubble(event_type_names::kCancel));
+}
+
 void HTMLFormControlElementWithState::FinishParsingChildren() {
   HTMLFormControlElement::FinishParsingChildren();
   ListedElement::TakeStateAndRestore();
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
index 5833de4..d4b213c 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element_with_state.h
@@ -56,6 +56,7 @@
 
   void DispatchInputEvent();
   void DispatchChangeEvent();
+  void DispatchCancelEvent();
 
  protected:
   bool user_has_edited_the_field_ = false;
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5
index 127b263..7a07175d 100644
--- a/third_party/blink/renderer/core/html/html_attribute_names.json5
+++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -285,9 +285,8 @@
     "ping",
     "policy",
     "popover",
-    "popoverhidetarget",
-    "popovershowtarget",
-    "popovertoggletarget",
+    "popovertarget",
+    "popovertargetaction",
     "poster",
     "preload",
     "property",
diff --git a/third_party/blink/renderer/core/html/keywords.json5 b/third_party/blink/renderer/core/html/keywords.json5
index 3a85562..46b2577 100644
--- a/third_party/blink/renderer/core/html/keywords.json5
+++ b/third_party/blink/renderer/core/html/keywords.json5
@@ -78,6 +78,9 @@
     "auto",
     "hint",
     "async",
+    "show",
+    "hide",
+    "toggle",
 
     // referrerpolicy attribute
     // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
index 7e5a3e8b..59bab40 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -392,16 +392,16 @@
   }
 
   auto* canvas = resource_provider->Canvas();
-
-  auto affineTransform = input->CurrentFrameOrientation().TransformFromDefault(
-      gfx::SizeF(src_rect.size()));
+  ImageOrientation orientation = input->CurrentFrameOrientation();
+  auto affineTransform =
+      orientation.TransformToDefault(gfx::SizeF(src_rect.size()));
   canvas->concat(AffineTransformToSkM44(affineTransform));
 
   gfx::Rect dst_rect = src_rect;
   // The destination rect will have its width and height already reversed
   // for the orientation of the image, as it was needed for page layout, so
   // we need to reverse it back here.
-  if (input->CurrentFrameOrientation().UsesWidthAsHeight()) {
+  if (orientation.UsesWidthAsHeight()) {
     dst_rect.set_size(gfx::TransposeSize(dst_rect.size()));
   }
 
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 fa8f365..473220d 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
@@ -30,8 +30,14 @@
   // should be used exclusively by subgrids to differentiate such scenario.
   NGGridPlacementData(const ComputedStyle& grid_style,
                       const NGGridLineResolver& parent_line_resolver,
-                      GridArea subgrid_area)
-      : line_resolver(grid_style, parent_line_resolver, subgrid_area) {}
+                      GridArea subgrid_area,
+                      wtf_size_t column_auto_repetitions,
+                      wtf_size_t row_auto_repetitions)
+      : line_resolver(grid_style,
+                      parent_line_resolver,
+                      subgrid_area,
+                      column_auto_repetitions,
+                      row_auto_repetitions) {}
 
   // This constructor only copies inputs to the auto-placement algorithm.
   NGGridPlacementData(const NGGridPlacementData& other)
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 feca36f0..12bc5e9 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
@@ -456,8 +456,11 @@
 
 namespace {
 
-GridArea SubgriddedAreaInParent(const GridItemData& subgrid_data) {
-  DCHECK(subgrid_data.IsSubgrid());
+absl::optional<GridArea> SubgriddedAreaInParent(
+    const GridItemData& subgrid_data) {
+  if (!subgrid_data.IsSubgrid()) {
+    return absl::nullopt;
+  }
 
   auto subgridded_area_in_parent = subgrid_data.resolved_position;
 
@@ -488,22 +491,22 @@
 
   const auto& node = Node();
   const auto& style = node.Style();
-  wtf_size_t column_auto_repetitions = kNotFound;
-  wtf_size_t row_auto_repetitions = kNotFound;
+  absl::optional<GridArea> subgrid_area =
+      subgrid_data ? SubgriddedAreaInParent(*subgrid_data) : absl::nullopt;
+  wtf_size_t column_auto_repetitions =
+      ComputeAutomaticRepetitions(kForColumns, subgrid_area);
+  wtf_size_t row_auto_repetitions =
+      ComputeAutomaticRepetitions(kForRows, subgrid_area);
 
-  // TODO(ethavar): Compute automatic repetitions for subgridded axes as
-  // described in https://drafts.csswg.org/css-grid-2/#auto-repeat.
-  if (!parent_sizing_data) {
-    column_auto_repetitions = ComputeAutomaticRepetitions(kForColumns);
-    row_auto_repetitions = ComputeAutomaticRepetitions(kForRows);
-  }
-
-  // Initialize this grid's placement data.
+  // Initialize this grid's placement data. Standalone grids will have no
+  // `parent_line_resolver` and subgrids should have both `parent_line_resolver`
+  // and `subgrid_area`.
   // TODO(kschmi): Remove placement data from `NGGridPlacement`.
+  DCHECK(!parent_line_resolver || subgrid_area);
   auto placement_data =
       parent_line_resolver
-          ? NGGridPlacementData(style, *parent_line_resolver,
-                                SubgriddedAreaInParent(*subgrid_data))
+          ? NGGridPlacementData(style, *parent_line_resolver, *subgrid_area,
+                                column_auto_repetitions, row_auto_repetitions)
           : NGGridPlacementData(style, column_auto_repetitions,
                                 row_auto_repetitions);
   bool has_nested_subgrid = false;
@@ -1313,7 +1316,8 @@
 
 // https://drafts.csswg.org/css-grid-2/#auto-repeat
 wtf_size_t NGGridLayoutAlgorithm::ComputeAutomaticRepetitions(
-    GridTrackSizingDirection track_direction) const {
+    GridTrackSizingDirection track_direction,
+    absl::optional<GridArea> subgrid_area) const {
   const bool is_for_columns = track_direction == kForColumns;
   const auto& track_list = is_for_columns
                                ? Style().GridTemplateColumns().TrackList()
@@ -1322,6 +1326,15 @@
   if (!track_list.HasAutoRepeater())
     return 0;
 
+  // Subgrids compute auto repetitions differently than standalone grids. See
+  // https://drafts.csswg.org/css-grid-2/#auto-repeat.
+  const auto subgrid_span = subgrid_area ? subgrid_area->Span(track_direction)
+                                         : GridSpan::IndefiniteGridSpan();
+  if (subgrid_area && subgrid_span.IsTranslatedDefinite()) {
+    return ComputeAutomaticRepetitionsForSubgrid(track_direction,
+                                                 subgrid_span.IntegerSpan());
+  }
+
   LayoutUnit available_size = is_for_columns ? grid_available_size_.inline_size
                                              : grid_available_size_.block_size;
   LayoutUnit max_available_size = available_size;
@@ -1427,6 +1440,42 @@
   return (count <= 0) ? 1u : count;
 }
 
+wtf_size_t NGGridLayoutAlgorithm::ComputeAutomaticRepetitionsForSubgrid(
+    GridTrackSizingDirection track_direction,
+    wtf_size_t subgrid_span_size) const {
+  // "On a subgridded axis, the auto-fill keyword is only valid once per
+  // <line-name-list>, and repeats enough times for the name list to match the
+  // subgrid’s specified grid span (falling back to 0 if the span is already
+  // fulfilled).
+  // https://drafts.csswg.org/css-grid-2/#auto-repeat
+  const auto& computed_track_list = (track_direction == kForColumns)
+                                        ? Style().GridTemplateColumns()
+                                        : Style().GridTemplateRows();
+  const auto& track_list = computed_track_list.TrackList();
+  DCHECK(track_list.HasAutoRepeater());
+
+  const wtf_size_t non_auto_repeat_named_grid_line_count =
+      computed_track_list.ordered_named_grid_lines.size();
+  if (non_auto_repeat_named_grid_line_count > subgrid_span_size) {
+    // No more room left for auto repetitions due to the number of non-auto
+    // repeat named grid lines (the span is already fulfilled).
+    return 0;
+  }
+
+  const wtf_size_t tracks_per_repeat =
+      track_list.RepeaterCount() * track_list.AutoRepeatTrackCount();
+  if (tracks_per_repeat > subgrid_span_size) {
+    // No room left for auto repetitions because each repetition is too large.
+    return 0;
+  }
+
+  const wtf_size_t tracks_left_over_for_auto_repeat =
+      subgrid_span_size - non_auto_repeat_named_grid_line_count + 1;
+  DCHECK_GT(tracks_per_repeat, 0u);
+  return static_cast<wtf_size_t>(
+      std::floor(tracks_left_over_for_auto_repeat / tracks_per_repeat));
+}
+
 void NGGridLayoutAlgorithm::CalculateAlignmentBaselines(
     const NGGridLayoutData& layout_data,
     SizingConstraint sizing_constraint,
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 59e09e0..b9a407c9 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
@@ -105,7 +105,13 @@
       GridItemData* grid_item) const;
 
   wtf_size_t ComputeAutomaticRepetitions(
-      GridTrackSizingDirection track_direction) const;
+      GridTrackSizingDirection track_direction,
+      absl::optional<GridArea> subgrid_area) const;
+
+  // Subgrids compute auto repetitions differently than standalone grids.
+  wtf_size_t ComputeAutomaticRepetitionsForSubgrid(
+      GridTrackSizingDirection track_direction,
+      wtf_size_t subgrid_span_size) const;
 
   // Determines the major/minor alignment baselines for each row/column based on
   // each item in |grid_items|, and stores the results in |track_collection|.
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
index ebdf6cdd..130f767 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
@@ -29,8 +29,12 @@
 NGGridLineResolver::NGGridLineResolver(
     const ComputedStyle& grid_style,
     const NGGridLineResolver& parent_line_resolver,
-    GridArea subgrid_area)
+    GridArea subgrid_area,
+    wtf_size_t column_auto_repetitions,
+    wtf_size_t row_auto_repetitions)
     : style_(&grid_style),
+      column_auto_repetitions_(column_auto_repetitions),
+      row_auto_repetitions_(row_auto_repetitions),
       subgridded_columns_merged_explicit_grid_line_names_(
           grid_style.GridTemplateColumns().named_grid_lines),
       subgridded_rows_merged_explicit_grid_line_names_(
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
index 3aff4ce..b07aaa9 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
@@ -39,7 +39,9 @@
   // should be used exclusively by subgrids to differentiate such scenario.
   explicit NGGridLineResolver(const ComputedStyle& grid_style,
                               const NGGridLineResolver& parent_line_resolver,
-                              GridArea subgrid_area);
+                              GridArea subgrid_area,
+                              wtf_size_t column_auto_repetitions,
+                              wtf_size_t row_auto_repetitions);
 
   bool operator==(const NGGridLineResolver& other) const;
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
index 37f90103..4b69086 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
@@ -83,7 +83,11 @@
   if (auto_repeat_track_list_length_ == 0 || line < insertion_point_)
     return find(named_lines_indexes_, line);
 
-  DCHECK(auto_repeat_total_tracks_);
+  // Subgrids are allowed to have an auto repeat count of zero.
+  if (auto_repeat_total_tracks_ == 0) {
+    DCHECK(!is_standalone_grid_);
+    return false;
+  }
 
   if (line > insertion_point_ + auto_repeat_total_tracks_)
     return find(named_lines_indexes_, line - (auto_repeat_total_tracks_ - 1));
diff --git a/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc b/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
index 114f5966..110343c 100644
--- a/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
+++ b/third_party/blink/renderer/core/permissions_policy/permissions_policy_parser.cc
@@ -14,7 +14,6 @@
 #include "third_party/blink/public/common/permissions_policy/origin_with_possible_wildcards.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/frame/deprecation/deprecation.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
@@ -261,11 +260,11 @@
   // window-management is an alias for window-placement (crbug.com/1328581).
   // Track usage of the alias used.
   if (feature_name == "window-placement") {
-    Deprecation::CountDeprecation(
-        execution_context_, WebFeature::kWindowPlacementPermissionPolicyParsed);
+    UseCounter::Count(this->execution_context_,
+                      WebFeature::kWindowPlacementPermissionPolicyParsed);
   }
   if (feature_name == "window-management") {
-    UseCounter::Count(execution_context_,
+    UseCounter::Count(this->execution_context_,
                       WebFeature::kWindowManagementPermissionPolicyParsed);
   }
   const String& effective_feature_name =
diff --git a/third_party/blink/renderer/core/style/computed_grid_track_list.h b/third_party/blink/renderer/core/style/computed_grid_track_list.h
index 4815b7a..e9d35a2 100644
--- a/third_party/blink/renderer/core/style/computed_grid_track_list.h
+++ b/third_party/blink/renderer/core/style/computed_grid_track_list.h
@@ -15,9 +15,6 @@
 
 namespace blink {
 
-enum class AutoRepeatType : uint8_t { kNoAutoRepeat, kAutoFill, kAutoFit };
-enum class GridAxisType : uint8_t { kStandaloneAxis, kSubgriddedAxis };
-
 struct CORE_EXPORT ComputedGridTrackList {
   ComputedGridTrackList() = default;
 
diff --git a/third_party/blink/renderer/core/style/grid_track_list.cc b/third_party/blink/renderer/core/style/grid_track_list.cc
index 8c08303..9da3f98 100644
--- a/third_party/blink/renderer/core/style/grid_track_list.cc
+++ b/third_party/blink/renderer/core/style/grid_track_list.cc
@@ -55,6 +55,8 @@
 }
 
 wtf_size_t NGGridTrackList::RepeatIndex(const wtf_size_t index) const {
+  // `repeat_index` is used for sizes, which subgrids don't have.
+  DCHECK_NE(axis_type_, GridAxisType::kSubgriddedAxis);
   DCHECK_LT(index, RepeaterCount());
   return repeaters_[index].repeat_index;
 }
@@ -73,6 +75,8 @@
 const GridTrackSize& NGGridTrackList::RepeatTrackSize(
     const wtf_size_t index,
     const wtf_size_t n) const {
+  // Subgrids don't have track sizes associated with them.
+  DCHECK_NE(axis_type_, GridAxisType::kSubgriddedAxis);
   DCHECK_LT(index, RepeaterCount());
   DCHECK_LT(n, RepeatSize(index));
 
@@ -96,8 +100,13 @@
 bool NGGridTrackList::AddRepeater(
     const Vector<GridTrackSize, 1>& repeater_track_sizes,
     NGGridTrackRepeater::RepeatType repeat_type,
-    wtf_size_t repeat_count) {
-  if (repeat_count == 0u || repeater_track_sizes.empty()) {
+    wtf_size_t repeat_count,
+    wtf_size_t repeat_number_of_lines) {
+  // Non-subgrid repeaters always have sizes associated with them, while
+  // subgrids repeaters never do, as sizes will come from the parent grid.
+  DCHECK(!IsSubgriddedAxis() || repeater_track_sizes.empty());
+  if (!IsSubgriddedAxis() &&
+      (repeat_count == 0u || repeater_track_sizes.empty())) {
     return false;
   }
 
@@ -107,8 +116,10 @@
          repeat_count == 1u);
 
   // Ensure adding tracks will not overflow the total in this track list and
-  // that there is only one auto repeater per track list.
-  wtf_size_t repeat_size = repeater_track_sizes.size();
+  // that there is only one auto repeater per track list. For subgrids,
+  // track sizes are not supported, so use the number of lines specified.
+  wtf_size_t repeat_size =
+      IsSubgriddedAxis() ? repeat_number_of_lines : repeater_track_sizes.size();
   switch (repeat_type) {
     case NGGridTrackRepeater::RepeatType::kNoRepeat:
     case NGGridTrackRepeater::RepeatType::kInteger:
@@ -129,7 +140,9 @@
 
   repeaters_.emplace_back(repeater_track_sizes_.size(), repeat_size,
                           repeat_count, repeat_type);
-  repeater_track_sizes_.AppendVector(repeater_track_sizes);
+  if (!IsSubgriddedAxis()) {
+    repeater_track_sizes_.AppendVector(repeater_track_sizes);
+  }
   return true;
 }
 
@@ -151,6 +164,14 @@
   return auto_repeater_index_ != kNotFound;
 }
 
+bool NGGridTrackList::IsSubgriddedAxis() const {
+  return axis_type_ == GridAxisType::kSubgriddedAxis;
+}
+
+void NGGridTrackList::SetAxisType(GridAxisType axis_type) {
+  axis_type_ = axis_type;
+}
+
 wtf_size_t NGGridTrackList::AvailableTrackCount() const {
   return kNotFound - 1 - track_count_without_auto_repeat_;
 }
diff --git a/third_party/blink/renderer/core/style/grid_track_list.h b/third_party/blink/renderer/core/style/grid_track_list.h
index 1d159c836..f96a1465b 100644
--- a/third_party/blink/renderer/core/style/grid_track_list.h
+++ b/third_party/blink/renderer/core/style/grid_track_list.h
@@ -13,6 +13,9 @@
 
 namespace blink {
 
+enum class AutoRepeatType : uint8_t { kNoAutoRepeat, kAutoFill, kAutoFit };
+enum class GridAxisType : uint8_t { kStandaloneAxis, kSubgriddedAxis };
+
 // Stores tracks related data by compressing repeated tracks into a single node.
 struct NGGridTrackRepeater {
   enum RepeatType {
@@ -61,7 +64,7 @@
 
   // Returns the count of repeaters.
   wtf_size_t RepeaterCount() const;
-  // Returns the count of all tracks ignoring those within an auto repeater.
+  // Returns the count of all tracks, ignoring those within an auto repeater.
   wtf_size_t TrackCountWithoutAutoRepeat() const;
   // Returns the number of tracks in the auto repeater, or 0 if there is none.
   wtf_size_t AutoRepeatTrackCount() const;
@@ -69,9 +72,14 @@
   bool AddRepeater(const Vector<GridTrackSize, 1>& repeater_track_sizes,
                    NGGridTrackRepeater::RepeatType repeat_type =
                        NGGridTrackRepeater::RepeatType::kNoRepeat,
-                   wtf_size_t repeat_count = 1u);
+                   wtf_size_t repeat_count = 1u,
+                   wtf_size_t repeat_number_of_lines = 1u);
   // Returns true if this list contains an auto repeater.
   bool HasAutoRepeater() const;
+  // Returns true if this is a subgridded track list.
+  bool IsSubgriddedAxis() const;
+  // Sets the axis type (standalone or subgrid).
+  void SetAxisType(GridAxisType axis_type);
 
   // Clears all data.
   void Clear();
@@ -94,9 +102,13 @@
 
   // The index of the automatic repeater, if there is one; |kInvalidRangeIndex|
   // otherwise.
-  wtf_size_t auto_repeater_index_ = kNotFound;
+  wtf_size_t auto_repeater_index_{kNotFound};
+
   // Count of tracks ignoring those within an auto repeater.
-  wtf_size_t track_count_without_auto_repeat_ = 0;
+  wtf_size_t track_count_without_auto_repeat_{0};
+
+  // The grid axis type (standalone or subgridded).
+  GridAxisType axis_type_{GridAxisType::kStandaloneAxis};
 };
 
 // This class wraps both legacy grid track list type, and the GridNG version:
diff --git a/third_party/blink/renderer/modules/permissions/permission_utils.cc b/third_party/blink/renderer/modules/permissions/permission_utils.cc
index 4ab0764..11b142e 100644
--- a/third_party/blink/renderer/modules/permissions/permission_utils.cc
+++ b/third_party/blink/renderer/modules/permissions/permission_utils.cc
@@ -344,9 +344,8 @@
     return CreatePermissionDescriptor(PermissionName::WINDOW_MANAGEMENT);
   }
   if (name == "window-placement") {
-    Deprecation::CountDeprecation(
-        CurrentExecutionContext(script_state->GetIsolate()),
-        WebFeature::kWindowPlacementPermissionDescriptorUsed);
+    UseCounter::Count(CurrentExecutionContext(script_state->GetIsolate()),
+                      WebFeature::kWindowPlacementPermissionDescriptorUsed);
     return CreatePermissionDescriptor(PermissionName::WINDOW_MANAGEMENT);
   }
   if (name == "local-fonts") {
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto b/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
index 9be9767..7bd4c97e 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
@@ -110,6 +110,10 @@
   optional bytes description = 4;
 }
 
+message AacEncoderConfig {
+  optional string format = 1;
+}
+
 message ConfigureAudioEncoder {
   // String describing codec (e.g. "opus")
   optional string codec = 1;
@@ -119,6 +123,8 @@
   optional uint32 number_of_channels = 3;
 
   optional uint64 bitrate = 4;
+
+  optional AacEncoderConfig aac = 5;
 }
 
 enum EncodedChunkType {
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_seed_corpus/audio_encoder/encode_aac.textproto b/third_party/blink/renderer/modules/webcodecs/fuzzer_seed_corpus/audio_encoder/encode_aac.textproto
index 8f5f24f..8e1ef40 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_seed_corpus/audio_encoder/encode_aac.textproto
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_seed_corpus/audio_encoder/encode_aac.textproto
@@ -12,7 +12,10 @@
       codec: 'mp4a.67',
       sample_rate: 48000,
       number_of_channels: 2,
-      bitrate: 96000
+      bitrate: 96000,
+      aac {
+        format: 'aac'
+      }
     }
   },
   {
@@ -48,7 +51,10 @@
       codec: 'mp4a.67',
       sample_rate: 44100,
       number_of_channels: 1,
-      bitrate: 128000
+      bitrate: 128000,
+      aac {
+        format: 'adts'
+      }
     }
   },
   {
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
index 97b810931..9417e56 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
@@ -14,6 +14,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_dom_rect_init.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_image_bitmap_options.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_aac_encoder_config.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data_copy_to_options.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data_init.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_decoder_config.h"
@@ -124,6 +125,14 @@
   config->setNumberOfChannels(proto.number_of_channels());
   config->setSampleRate(proto.sample_rate());
 
+  if (proto.has_aac()) {
+    auto* aac = AacEncoderConfig::Create();
+    config->setAac(aac);
+    if (proto.aac().has_format()) {
+      aac->setFormat(proto.aac().format().c_str());
+    }
+  }
+
   return config;
 }
 
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
index 50e20b6..37b73c8 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -867,10 +867,10 @@
   DCHECK_GT(requested_encodes_, 0u);
 
   auto frame = request->input->frame();
-  bool keyframe = request->encodeOpts->hasKeyFrameNonNull() &&
-                  request->encodeOpts->keyFrameNonNull();
+  auto encode_options = CreateEncodeOptions(request);
   active_encodes_++;
-  request->StartTracingVideoEncode(keyframe, frame->timestamp());
+  request->StartTracingVideoEncode(encode_options.key_frame,
+                                   frame->timestamp());
 
   auto encode_done_callback = ConvertToBaseOnceCallback(CrossThreadBindOnce(
       &VideoEncoder::OnEncodeDone, MakeUnwrappingCrossThreadWeakHandle(this),
@@ -886,8 +886,8 @@
   // TODO(crbug.com/1229845): We shouldn't be reading back frames here.
   if (frame->HasTextures() && !frame->HasGpuMemoryBuffer()) {
     auto readback_done_callback = WTF::BindOnce(
-        &VideoEncoder::OnReadbackDone, WrapWeakPersistent(this), keyframe,
-        reset_count_, frame, std::move(encode_done_callback));
+        &VideoEncoder::OnReadbackDone, WrapWeakPersistent(this),
+        WrapPersistent(request), frame, std::move(encode_done_callback));
     if (StartReadback(std::move(frame), std::move(readback_done_callback))) {
       request->input->close();
     } else {
@@ -913,21 +913,30 @@
 
   --requested_encodes_;
   ScheduleDequeueEvent();
-  media_encoder_->Encode(frame, keyframe, std::move(encode_done_callback));
+  media_encoder_->Encode(frame, encode_options,
+                         std::move(encode_done_callback));
 
   // We passed a copy of frame() above, so this should be safe to close here.
   request->input->close();
 }
 
+media::VideoEncoder::EncodeOptions VideoEncoder::CreateEncodeOptions(
+    Request* request) {
+  media::VideoEncoder::EncodeOptions result;
+  result.key_frame = request->encodeOpts->hasKeyFrameNonNull() &&
+                     request->encodeOpts->keyFrameNonNull();
+  return result;
+}
+
 void VideoEncoder::OnReadbackDone(
-    bool keyframe,
-    uint32_t reset_count,
+    Request* request,
     scoped_refptr<media::VideoFrame> txt_frame,
     media::VideoEncoder::EncoderStatusCB done_callback,
     scoped_refptr<media::VideoFrame> result_frame) {
   TRACE_EVENT_NESTABLE_ASYNC_END0("media", "CopyRGBATextureToVideoFrame", this);
-  if (reset_count_ != reset_count)
+  if (reset_count_ != request->reset_count) {
     return;
+  }
 
   if (!result_frame) {
     callback_runner_->PostTask(
@@ -940,10 +949,11 @@
   }
 
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  auto encode_options = CreateEncodeOptions(request);
   --requested_encodes_;
   ScheduleDequeueEvent();
   blocking_request_in_progress_ = false;
-  media_encoder_->Encode(std::move(result_frame), keyframe,
+  media_encoder_->Encode(std::move(result_frame), encode_options,
                          std::move(done_callback));
   ProcessRequests();
 }
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.h b/third_party/blink/renderer/modules/webcodecs/video_encoder.h
index ace1aa4..c5bbdb60 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_encoder.h
+++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.h
@@ -103,9 +103,9 @@
   void ResetInternal() override;
 
   void OnEncodeDone(Request* request, media::EncoderStatus status);
+  media::VideoEncoder::EncodeOptions CreateEncodeOptions(Request* request);
   // This will execute shortly after the async readback completes.
-  void OnReadbackDone(bool keyframe,
-                      uint32_t reset_count,
+  void OnReadbackDone(Request* request,
                       scoped_refptr<media::VideoFrame> txt_frame,
                       media::VideoEncoder::EncoderStatusCB done_callback,
                       scoped_refptr<media::VideoFrame> result_frame);
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data.cc b/third_party/blink/renderer/platform/fonts/font_platform_data.cc
index 3f5a68e3..11766e0 100644
--- a/third_party/blink/renderer/platform/fonts/font_platform_data.cc
+++ b/third_party/blink/renderer/platform/fonts/font_platform_data.cc
@@ -62,7 +62,7 @@
 BASE_FEATURE(kOptimizeLinuxFonts,
              "OptimizeLinuxFonts",
              base::FEATURE_DISABLED_BY_DEFAULT);
-#endif
+#endif  //  BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
 
@@ -116,7 +116,7 @@
     : typeface_(typeface),
 #if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_MAC)
       family_(family),
-#endif
+#endif  // !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_MAC)
       text_size_(text_size),
       synthetic_bold_(synthetic_bold),
       synthetic_italic_(synthetic_italic),
@@ -132,7 +132,7 @@
       base::FeatureList::IsEnabled(kOptimizeLinuxFonts);
 #else
   bool override_font_name_and_size = false;
-#endif
+#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   if (override_font_name_and_size) {
     system_style = QuerySystemRenderStyle(
         FontFamilyName().Utf8(), 0, typeface_->fontStyle(), text_rendering);
@@ -151,9 +151,9 @@
   }
 #else
   auto system_style = QuerySystemForRenderStyle();
-#endif
+#endif  // !BUILDFLAG(IS_WIN)
   style_.OverrideWith(system_style);
-#endif
+#endif  // !BUILDFLAG(IS_MAC)
 }
 
 FontPlatformData::~FontPlatformData() = default;
@@ -281,7 +281,8 @@
     // 0 means HINTING_NONE, see |ConvertHinting| in font_service_app.cc.
     result.hint_style = 0;
   }
-#endif
+#endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_FUCHSIA) &&
+        // !BUILDFLAG(IS_IOS)
 
   return result;
 }
@@ -300,7 +301,7 @@
 
   return font;
 }
-#endif
+#endif  // !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN)
 
 scoped_refptr<OpenTypeVerticalData> FontPlatformData::CreateVerticalData()
     const {
diff --git a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
index 7f5d4a9..a56629ff 100644
--- a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+++ b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
@@ -289,25 +289,30 @@
   if (!typeface)
     return nullptr;
 
+  bool synthetic_bold =
+      (font_description.Weight() >
+           FontSelectionValue(200) +
+               FontSelectionValue(typeface->fontStyle().weight()) ||
+       font_description.IsSyntheticBold()) &&
+      font_description.GetFontSynthesisWeight() ==
+          FontDescription::kAutoFontSynthesisWeight;
+
+  bool synthetic_italic = (((font_description.Style() == ItalicSlopeValue()) &&
+                            !typeface->isItalic()) ||
+                           font_description.IsSyntheticItalic()) &&
+                          font_description.GetFontSynthesisStyle() ==
+                              FontDescription::kAutoFontSynthesisStyle;
+
+  ResolvedFontFeatures resolved_font_features =
+      font_description.GetFontVariantAlternates()
+          ? font_description.GetFontVariantAlternates()
+                ->GetResolvedFontFeatures()
+          : ResolvedFontFeatures();
+
   std::unique_ptr<FontPlatformData> font_platform_data =
       std::make_unique<FontPlatformData>(
-          typeface, name, font_size,
-          ((font_description.Weight() >
-                FontSelectionValue(200) +
-                    FontSelectionValue(typeface->fontStyle().weight()) ||
-            font_description.IsSyntheticBold()) &&
-           font_description.GetFontSynthesisWeight() ==
-               FontDescription::kAutoFontSynthesisWeight),
-          (((font_description.Style() == ItalicSlopeValue()) &&
-            !typeface->isItalic()) ||
-           font_description.IsSyntheticItalic()) &&
-              font_description.GetFontSynthesisStyle() ==
-                  FontDescription::kAutoFontSynthesisStyle,
-          font_description.TextRendering(),
-          font_description.GetFontVariantAlternates()
-              ? font_description.GetFontVariantAlternates()
-                    ->GetResolvedFontFeatures()
-              : ResolvedFontFeatures(),
+          typeface, name, font_size, synthetic_bold, synthetic_italic,
+          font_description.TextRendering(), resolved_font_features,
           font_description.Orientation());
 
   font_platform_data->SetAvoidEmbeddedBitmaps(
diff --git a/third_party/blink/renderer/platform/graphics/image_orientation.cc b/third_party/blink/renderer/platform/graphics/image_orientation.cc
index e1024b5..20d926a 100644
--- a/third_party/blink/renderer/platform/graphics/image_orientation.cc
+++ b/third_party/blink/renderer/platform/graphics/image_orientation.cc
@@ -60,4 +60,32 @@
   return AffineTransform();
 }
 
+AffineTransform ImageOrientation::TransformToDefault(
+    const gfx::SizeF& drawn_size) const {
+  float w = drawn_size.width();
+  float h = drawn_size.height();
+
+  switch (orientation_) {
+    case ImageOrientationEnum::kOriginTopLeft:
+      return AffineTransform();
+    case ImageOrientationEnum::kOriginTopRight:
+      return AffineTransform(-1, 0, 0, 1, w, 0);
+    case ImageOrientationEnum::kOriginBottomRight:
+      return AffineTransform(-1, 0, 0, -1, w, h);
+    case ImageOrientationEnum::kOriginBottomLeft:
+      return AffineTransform(1, 0, 0, -1, 0, h);
+    case ImageOrientationEnum::kOriginLeftTop:
+      return AffineTransform(0, 1, 1, 0, 0, 0);
+    case ImageOrientationEnum::kOriginRightTop:
+      return AffineTransform(0, -1, 1, 0, 0, h);
+    case ImageOrientationEnum::kOriginRightBottom:
+      return AffineTransform(0, -1, -1, 0, w, h);
+    case ImageOrientationEnum::kOriginLeftBottom:
+      return AffineTransform(0, 1, -1, 0, w, 0);
+  }
+
+  NOTREACHED();
+  return AffineTransform();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/image_orientation.h b/third_party/blink/renderer/platform/graphics/image_orientation.h
index f9c83e5..5cac53c 100644
--- a/third_party/blink/renderer/platform/graphics/image_orientation.h
+++ b/third_party/blink/renderer/platform/graphics/image_orientation.h
@@ -92,6 +92,11 @@
   // orientation. It should be used in a right-handed coordinate system.
   AffineTransform TransformFromDefault(const gfx::SizeF& drawn_size) const;
 
+  // This transform can be used to reverse an image orientation, it's for
+  // drawing an image according to the way it is encoded. It should be used in a
+  // right-handed coordinate system.
+  AffineTransform TransformToDefault(const gfx::SizeF& drawn_size) const;
+
   inline bool operator==(const ImageOrientation& other) const {
     return other.orientation_ == orientation_;
   }
diff --git a/third_party/blink/tools/OWNERS b/third_party/blink/tools/OWNERS
index 111d1e0..96c6224 100644
--- a/third_party/blink/tools/OWNERS
+++ b/third_party/blink/tools/OWNERS
@@ -3,3 +3,5 @@
 tkent@chromium.org
 wangxianzhu@chromium.org
 weizhong@google.com
+
+per-file run_wpt_tests.py=jonathanjlee@google.com
diff --git a/third_party/blink/tools/blinkpy/common/config/builders.json b/third_party/blink/tools/blinkpy/common/config/builders.json
index f27c6db..3dbf585 100644
--- a/third_party/blink/tools/blinkpy/common/config/builders.json
+++ b/third_party/blink/tools/blinkpy/common/config/builders.json
@@ -91,6 +91,17 @@
             }
         }
     },
+    "mac12-wpt-content-shell-fyi-rel": {
+        "main": "chromium.fyi",
+        "port_name": "mac-mac12",
+        "specifiers": ["Mac12", "Release"],
+        "is_try_builder": true,
+        "steps": {
+            "wpt_tests_suite (with patch, experimental)": {
+                "uses_wptrunner": true
+            }
+        }
+    },
     "win10-wpt-content-shell-fyi-rel": {
         "main": "chromium.fyi",
         "port_name": "win-win10.20h2",
diff --git a/third_party/blink/tools/debug_renderer b/third_party/blink/tools/debug_renderer
index 1f40889..8ef7c08 100755
--- a/third_party/blink/tools/debug_renderer
+++ b/third_party/blink/tools/debug_renderer
@@ -34,27 +34,25 @@
   usage
 fi
 
-for TARGET_FLAG in "$@"; do
-  if ! [[ "$TARGET_FLAG" == "--"* ]]; then
-    URL=$TARGET_FLAG
-    break
-  fi
-done
+if [[ "$TARGET" =~ run_web_tests.py$ ]]; then
+  # Adjust flags to be passed to driver
+  WEB_TESTS_FLAGS=(--jobs=1 --timeout-ms=100000000 --driver-logging)
+  for DEFAULT_FLAG in "${DEFAULT_TARGET_FLAGS[@]}"; do
+    WEB_TESTS_FLAGS=(${WEB_TESTS_FLAGS[@]} --additional-driver-flag="$DEFAULT_FLAG")
+  done
+  TARGET_FLAGS=(${WEB_TESTS_FLAGS[@]} "$@")
+else
+  TARGET_FLAGS=(${DEFAULT_TARGET_FLAGS[@]} "$@")
+fi
 
-if [ -z "$DEBUG_URL"]; then
-  if [ -z "$URL"]; then
-    echo "Debugging first renderer"
-  else
-    echo "Debugging renderer for navigation URL: $URL"
-    DEBUG_URL=$URL
-  fi
+if [ -z "$DEBUG_URL" ]; then
+  echo "Debugging first renderer"
 fi
 
 # TODO: If you pass a URL containing characters that require URL encoding,
 # the URL will be encoded by chrome and won't be equivalent to the $DEBUG_URL.
 # We should url encode DEBUG_URL so that it matches the url chrome navigates to.
 RENDERER_PID_RE='Renderer url="([^"]+)" \(([0-9]+)\) paused waiting for debugger'
-TARGET_FLAGS=(${DEFAULT_TARGET_FLAGS[@]} "$@")
 
 if [ -z "$DEBUGGER" ]; then
   if which lldb > /dev/null; then
@@ -71,6 +69,17 @@
 
 OUTPUT=$(mktemp "${TMPDIR:-/tmp}"/"$(basename $0)".XXXXX)
 
+UNBUFFER=""
+# Use unbuffer to ensure we get the output while the subprocess is paused
+# waiting for a renderer.
+if [ -z `which unbuffer` ]; then
+  echo "Warning: Couldn't find unbuffer. Buffered output can result in" \
+        "failure to read the PID of the paused renderer from the pipe. If" \
+        "you encounter a hang install unbuffer tool from your package manager."
+else
+  UNBUFFER="unbuffer "
+fi
+
 maybe_kill() {
   [ -n "$1" ] && ps -p $1 > /dev/null && kill $1
 }
@@ -82,9 +91,10 @@
 }
 
 trap cleanup EXIT
-echo "$TARGET" ${TARGET_FLAGS[@]} >&2
-"$TARGET" ${TARGET_FLAGS[@]} > >(tee $OUTPUT) 2>&1 &
+echo "Running ${UNBUFFER}${TARGET} ${TARGET_FLAGS[@]}" >&2
+${UNBUFFER}"${TARGET}" "${TARGET_FLAGS[@]}" > >(tee $OUTPUT) 2>&1 &
 BROWSER_PID=$!
+echo "Process $BROWSER_PID logging to $OUTPUT"
 
 wait_renderer_pid() {
   NEXT_LINE=1
diff --git a/third_party/blink/tools/debug_web_tests b/third_party/blink/tools/debug_web_tests
deleted file mode 100755
index 4564780..0000000
--- a/third_party/blink/tools/debug_web_tests
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/bash
-# Copyright 2016 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Runs run-webkit-tests and attaches a debugger to the single renderer process.
-
-DEFAULT_TARGET_FLAGS=(--jobs=1 --timeout-ms=100000000 --additional-driver-flag=--no-sandbox --additional-driver-flag=--renderer-startup-dialog)
-
-SAW_DISABLE_FEATURES=false
-for TARGET_FLAG in "$@"; do
-  if [[ "$TARGET_FLAG" == "--additional-driver-flag=--disable-features="* ]]; then
-    TARGET_FLAG="$TARGET_FLAG,SpareRendererForSitePerProcess"
-    SAW_DISABLE_FEATURES=true
-  fi
-  TARGET_FLAGS+=("$TARGET_FLAG")
-done
-if [ $SAW_DISABLE_FEATURES != true ]; then
-  DEFAULT_TARGET_FLAGS+=(--additional-driver-flag=--disable-features=SpareRendererForSitePerProcess)
-fi
-TARGET_FLAGS=(${DEFAULT_TARGET_FLAGS[@]} ${TARGET_FLAGS[@]})
-
-if [ $# -eq 0 ]; then
-  echo "usage: $(basename $0) [run_web_tests.py args...] test-path/test-name.html"
-  exit 1
-fi
-
-OS=$(uname)
-SCRIPTS_DIR=$(dirname $0)
-if [[ "$OS" == "Darwin" ]]; then
-  CONTENT_SHELL="Content Shell.app"
-elif [[ "$OS" == "Linux" ]]; then
-  CONTENT_SHELL="content_shell"
-else
-  echo "Support for $OS has not been tested yet."
-  exit 1
-fi
-RENDERER_REGEX="/$CONTENT_SHELL.* --type=renderer .*--renderer-startup-dialog"
-
-if [ -z "$DEBUGGER" ]; then
-  if which lldb > /dev/null; then
-    DEBUGGER="lldb"
-    CONTINUE="continue"
-  elif which gdb > /dev/null; then
-    DEBUGGER="gdb -q"
-    CONTINUE="signal SIGUSR1"
-  else
-    echo "No debugger found"
-    exit 1
-  fi
-fi
-
-# Kill existing wpt serve scripts which may have hung from previous runs.
-pkill -f "wpt serve"
-
-# Kill existing matching renderers before we begin to ensure a clean run.
-pkill -f "$RENDERER_REGEX"
-
-# Run with a single child process as this script attaches only to the first renderer.
-$SCRIPTS_DIR/run_web_tests.py ${TARGET_FLAGS[@]} &
-
-wait_renderer_pid() {
-  for i in {1..200}; do
-    sleep 0.2
-    RENDERER_PID=$(pgrep -f "$RENDERER_REGEX")
-    [ -n "$RENDERER_PID" ] && return
-  done
-}
-
-wait_renderer_pid
-if [ -n "$RENDERER_PID" ]; then
-  # print yellow message
-  echo -e "\n\033[1;33mDebugging renderer, use '$CONTINUE' to run.\033[0m\n"
-  $DEBUGGER -p $RENDERER_PID
-else
-  echo "Timed out waiting for renderer."
-fi
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 18e13bbb..319c642 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3525,14 +3525,12 @@
 crbug.com/618969 external/wpt/css/css-grid/subgrid/orthogonal-writing-mode-004.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/parent-repeat-auto-fit-001.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/parent-repeat-auto-fit-002.html [ Failure ]
-crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-001.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-002.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-003.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-004.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-005.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-006.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-007.html [ Failure ]
-crbug.com/618969 external/wpt/css/css-grid/subgrid/repeat-auto-fill-008.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-001.html [ Failure ]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html [ Crash Failure Timeout ]
 
@@ -5557,9 +5555,6 @@
 # Skip devtools test hitting an unexpected tracing infrastructure exception 2021-10-04
 crbug.com/1255679 http/tests/devtools/service-workers/service-workers-wasm-test.js [ Failure Pass Timeout ]
 
-# Sheriff 2021-10-05
-crbug.com/1256755 http/tests/xmlhttprequest/cross-origin-unsupported-url.html [ Failure Pass ]
-
 # Disabled to allow devtools-frontend roll
 crbug.com/1258618 virtual/portals/http/tests/devtools/portals/portals-elements-nesting-after-adoption.js [ Crash Failure Pass Timeout ]
 
@@ -6895,7 +6890,6 @@
 crbug.com/1414105 [ Win ] virtual/gpu/fast/canvas/OffscreenCanvas-filter-in-worker.html [ Crash Failure Pass ]
 
 # Flaky tests. Disabling while investigating a deflake solution.
-crbug.com/1413838 http/tests/inspector-protocol/tracing/cpu-profiling.js [ Failure Pass ]
 crbug.com/1412866 http/tests/inspector-protocol/tracing/advanced-painting-instrumentation.js [ Failure Pass ]
 
 # Sheriff 2023-02-14
diff --git a/third_party/blink/web_tests/external/wpt/compat/webkit-text-fill-color-property-002.html.ini b/third_party/blink/web_tests/external/wpt/compat/webkit-text-fill-color-property-002.html.ini
new file mode 100644
index 0000000..47fb92c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/compat/webkit-text-fill-color-property-002.html.ini
@@ -0,0 +1,2 @@
+[webkit-text-fill-color-property-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini
new file mode 100644
index 0000000..34417d4f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/float-under-flatten-under-preserve-3d.html.ini
@@ -0,0 +1,2 @@
+[float-under-flatten-under-preserve-3d.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-placement-007.html.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-placement-007.html.ini
new file mode 100644
index 0000000..b22e1253
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-placement-007.html.ini
@@ -0,0 +1,2 @@
+[floats-placement-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/text/text-transform-bicameral-009.xht.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/text/text-transform-bicameral-009.xht.ini
new file mode 100644
index 0000000..c7edfd9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/text/text-transform-bicameral-009.xht.ini
@@ -0,0 +1,2 @@
+[text-transform-bicameral-009.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/text/white-space-bidirectionality-001.xht.ini b/third_party/blink/web_tests/external/wpt/css/CSS2/text/white-space-bidirectionality-001.xht.ini
new file mode 100644
index 0000000..dbb0905
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/text/white-space-bidirectionality-001.xht.ini
@@ -0,0 +1,2 @@
+[white-space-bidirectionality-001.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/gaps/gap-normal-used-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-align/gaps/gap-normal-used-002.html.ini
new file mode 100644
index 0000000..ba07bd3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-align/gaps/gap-normal-used-002.html.ini
@@ -0,0 +1,2 @@
+[gap-normal-used-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-attachment-353.html.ini b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-attachment-353.html.ini
new file mode 100644
index 0000000..d1af9d7d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-attachment-353.html.ini
@@ -0,0 +1,2 @@
+[background-attachment-353.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size/background-size-cover-contain-001.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size/background-size-cover-contain-001.xht.ini
new file mode 100644
index 0000000..66f1c578
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size/background-size-cover-contain-001.xht.ini
@@ -0,0 +1,2 @@
+[background-size-cover-contain-001.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/br-clear-all.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/br-clear-all.html.ini
new file mode 100644
index 0000000..e7f8f1c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/br-clear-all.html.ini
@@ -0,0 +1,2 @@
+[br-clear-all.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-float-dynamic-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/break-float-dynamic-001.html.ini
new file mode 100644
index 0000000..211f0e8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-float-dynamic-001.html.ini
@@ -0,0 +1,2 @@
+[break-float-dynamic-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/change-break-after.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/change-break-after.html.ini
new file mode 100644
index 0000000..2ea4c551
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/change-break-after.html.ini
@@ -0,0 +1,2 @@
+[change-break-after.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/flex-container-fragmentation-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/flex-container-fragmentation-005.html.ini
new file mode 100644
index 0000000..68711ec1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/flex-container-fragmentation-005.html.ini
@@ -0,0 +1,2 @@
+[flex-container-fragmentation-005.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/increase-fragmentainer-size-flex-item-trailing-margin.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/increase-fragmentainer-size-flex-item-trailing-margin.html.ini
new file mode 100644
index 0000000..db2a0ae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/increase-fragmentainer-size-flex-item-trailing-margin.html.ini
@@ -0,0 +1,2 @@
+[increase-fragmentainer-size-flex-item-trailing-margin.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-004.html.ini
new file mode 100644
index 0000000..7bfbed9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-004.html.ini
@@ -0,0 +1,2 @@
+[multi-line-row-flex-fragmentation-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-026.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-026.html.ini
new file mode 100644
index 0000000..71c92dbfc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/multi-line-row-flex-fragmentation-026.html.ini
@@ -0,0 +1,2 @@
+[multi-line-row-flex-fragmentation-026.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-017.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-017.html.ini
new file mode 100644
index 0000000..718bf7e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-017.html.ini
@@ -0,0 +1,2 @@
+[single-line-column-flex-fragmentation-017.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-018.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-018.html.ini
new file mode 100644
index 0000000..27b0cdc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-018.html.ini
@@ -0,0 +1,2 @@
+[single-line-column-flex-fragmentation-018.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-038.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-038.html.ini
new file mode 100644
index 0000000..6fe44b4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-038.html.ini
@@ -0,0 +1,2 @@
+[single-line-column-flex-fragmentation-038.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-047.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-047.html.ini
new file mode 100644
index 0000000..3049b5803
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-column-flex-fragmentation-047.html.ini
@@ -0,0 +1,2 @@
+[single-line-column-flex-fragmentation-047.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-009.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-009.html.ini
new file mode 100644
index 0000000..a7e1ab4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-009.html.ini
@@ -0,0 +1,2 @@
+[single-line-row-flex-fragmentation-009.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-028.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-028.html.ini
new file mode 100644
index 0000000..55d846f2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-028.html.ini
@@ -0,0 +1,2 @@
+[single-line-row-flex-fragmentation-028.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-032.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-032.html.ini
new file mode 100644
index 0000000..e814efe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-032.html.ini
@@ -0,0 +1,2 @@
+[single-line-row-flex-fragmentation-032.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-036.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-036.html.ini
new file mode 100644
index 0000000..cf434b29
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/flexbox/single-line-row-flex-fragmentation-036.html.ini
@@ -0,0 +1,2 @@
+[single-line-row-flex-fragmentation-036.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/float-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/float-003.html.ini
new file mode 100644
index 0000000..4f9edd17
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/float-003.html.ini
@@ -0,0 +1,2 @@
+[float-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-container-fragmentation-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-container-fragmentation-011.html.ini
new file mode 100644
index 0000000..6c3a397
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-container-fragmentation-011.html.ini
@@ -0,0 +1,2 @@
+[grid-container-fragmentation-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-001.html.ini
new file mode 100644
index 0000000..40fd717
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-001.html.ini
@@ -0,0 +1,2 @@
+[grid-item-fragmentation-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-004.html.ini
new file mode 100644
index 0000000..1149c3f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-004.html.ini
@@ -0,0 +1,2 @@
+[grid-item-fragmentation-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-007.html.ini
new file mode 100644
index 0000000..b0abc614
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/grid/grid-item-fragmentation-007.html.ini
@@ -0,0 +1,2 @@
+[grid-item-fragmentation-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-002.html.ini
new file mode 100644
index 0000000..9539a43
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-002.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-011.html.ini
new file mode 100644
index 0000000..efc084d1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-011.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html.ini
new file mode 100644
index 0000000..36baecd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-032.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-032.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-056.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-056.html.ini
new file mode 100644
index 0000000..1a69ba6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-056.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-056.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-070.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-070.html.ini
new file mode 100644
index 0000000..fccd75c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-070.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-070.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-089.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-089.html.ini
new file mode 100644
index 0000000..6a7ce7a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/out-of-flow-in-multicolumn-089.html.ini
@@ -0,0 +1,2 @@
+[out-of-flow-in-multicolumn-089.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/overflow-clip-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/overflow-clip-005.html.ini
new file mode 100644
index 0000000..965b6a9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/overflow-clip-005.html.ini
@@ -0,0 +1,2 @@
+[overflow-clip-005.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/overflowed-block-with-room-after-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/overflowed-block-with-room-after-004.html.ini
new file mode 100644
index 0000000..200df942
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/overflowed-block-with-room-after-004.html.ini
@@ -0,0 +1,2 @@
+[overflowed-block-with-room-after-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/parallel-flow-trailing-margin-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/parallel-flow-trailing-margin-002.html.ini
new file mode 100644
index 0000000..221f52f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/parallel-flow-trailing-margin-002.html.ini
@@ -0,0 +1,2 @@
+[parallel-flow-trailing-margin-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/table/repeated-section/multiple-row-groups.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/table/repeated-section/multiple-row-groups.tentative.html.ini
new file mode 100644
index 0000000..21c0f3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/table/repeated-section/multiple-row-groups.tentative.html.ini
@@ -0,0 +1,2 @@
+[multiple-row-groups.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/table/table-cell-expansion-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-cell-expansion-007.html.ini
new file mode 100644
index 0000000..3f93df61
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/table/table-cell-expansion-007.html.ini
@@ -0,0 +1,2 @@
+[table-cell-expansion-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/tall-float-pushed-to-next-fragmentainer-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/tall-float-pushed-to-next-fragmentainer-001.html.ini
new file mode 100644
index 0000000..7a076d0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/tall-float-pushed-to-next-fragmentainer-001.html.ini
@@ -0,0 +1,2 @@
+[tall-float-pushed-to-next-fragmentainer-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/trailing-child-margin-000.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/trailing-child-margin-000.html.ini
new file mode 100644
index 0000000..1e0f484
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/trailing-child-margin-000.html.ini
@@ -0,0 +1,2 @@
+[trailing-child-margin-000.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/transform-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-break/transform-002.html.ini
new file mode 100644
index 0000000..e095688
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/transform-002.html.ini
@@ -0,0 +1,2 @@
+[transform-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-004.html.ini
new file mode 100644
index 0000000..8d01ca5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-004.html.ini
@@ -0,0 +1,2 @@
+[contain-layout-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-012.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-012.html.ini
new file mode 100644
index 0000000..f4fbc65
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-layout-012.html.ini
@@ -0,0 +1,2 @@
+[contain-layout-012.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-011.html.ini
new file mode 100644
index 0000000..180db131
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-011.html.ini
@@ -0,0 +1,2 @@
+[contain-paint-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-026.html.ini b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-026.html.ini
new file mode 100644
index 0000000..7b3f18a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-026.html.ini
@@ -0,0 +1,2 @@
+[contain-paint-026.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/quotes-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-006.html.ini
new file mode 100644
index 0000000..baff1c1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-006.html.ini
@@ -0,0 +1,2 @@
+[quotes-006.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/quotes-009.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-009.html.ini
new file mode 100644
index 0000000..04699d2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-009.html.ini
@@ -0,0 +1,2 @@
+[quotes-009.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/quotes-013.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-013.html.ini
new file mode 100644
index 0000000..a79ab747
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-013.html.ini
@@ -0,0 +1,2 @@
+[quotes-013.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/quotes-014.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-014.html.ini
new file mode 100644
index 0000000..975133d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-014.html.ini
@@ -0,0 +1,2 @@
+[quotes-014.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-content/quotes-020.html.ini b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-020.html.ini
new file mode 100644
index 0000000..e409a47
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-content/quotes-020.html.ini
@@ -0,0 +1,2 @@
+[quotes-020.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-003.html.ini
new file mode 100644
index 0000000..8017835
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-003.html.ini
@@ -0,0 +1,2 @@
+[flex-aspect-ratio-img-column-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-004.html.ini
new file mode 100644
index 0000000..c62249a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-004.html.ini
@@ -0,0 +1,2 @@
+[flex-aspect-ratio-img-column-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-006.html.ini
new file mode 100644
index 0000000..bdb33aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-006.html.ini
@@ -0,0 +1,2 @@
+[flex-aspect-ratio-img-column-006.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-007.html.ini
new file mode 100644
index 0000000..f86dca3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-007.html.ini
@@ -0,0 +1,2 @@
+[flex-aspect-ratio-img-column-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-item-and-percentage-abspos.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-item-and-percentage-abspos.html.ini
new file mode 100644
index 0000000..eb83c0f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-item-and-percentage-abspos.html.ini
@@ -0,0 +1,2 @@
+[flex-item-and-percentage-abspos.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-001.html.ini
new file mode 100644
index 0000000..8753109
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-001.html.ini
@@ -0,0 +1,2 @@
+[flex-shrink-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-002.html.ini
new file mode 100644
index 0000000..0e22e275
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-shrink-002.html.ini
@@ -0,0 +1,2 @@
+[flex-shrink-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-items-flake-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-items-flake-001.html.ini
new file mode 100644
index 0000000..d39a1e8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-items-flake-001.html.ini
@@ -0,0 +1,2 @@
+[image-items-flake-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/col-wrap-012.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/col-wrap-012.html.ini
new file mode 100644
index 0000000..aa0fdd7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/col-wrap-012.html.ini
@@ -0,0 +1,2 @@
+[col-wrap-012.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-007.html.ini
new file mode 100644
index 0000000..7918147
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/percentage-heights-007.html.ini
@@ -0,0 +1,2 @@
+[percentage-heights-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-min-content-height-1.tentative.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-min-content-height-1.tentative.html.ini
new file mode 100644
index 0000000..17d5171d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-min-content-height-1.tentative.html.ini
@@ -0,0 +1,2 @@
+[table-as-item-min-content-height-1.tentative.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-stretch-cross-size-2.html.ini b/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-stretch-cross-size-2.html.ini
new file mode 100644
index 0000000..0eb309da
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/table-as-item-stretch-cross-size-2.html.ini
@@ -0,0 +1,2 @@
+[table-as-item-stretch-cross-size-2.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/cjk-kerning.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/cjk-kerning.html.ini
index 5ecb735b..90d85356 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/cjk-kerning.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/cjk-kerning.html.ini
@@ -1,19 +1,24 @@
 [cjk-kerning.html]
-  [expected match: .kernON .cjk vs .paltONkernON .cjk]
+  [expected match: .default .cjk vs .kernOFF .cjk]
     expected:
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS
+      if (product == "content_shell") and (os == "mac"): PASS
       if product == "chrome": PASS
       FAIL
 
-  [expected match: .default .cjk vs .kernOFF .cjk]
+  [expected match: .kernON .cjk vs .paltONkernON .cjk]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
-      if (product == "content_shell") and (os == "linux"): FAIL
+      if (product == "content_shell") and (os == "mac"): PASS
+      if product == "chrome": PASS
+      FAIL
 
   [expected mismatch: .kernOFF .cjk vs .kernON .cjk]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
+      if (product == "content_shell") and (os == "mac"): FAIL
       if product == "chrome": FAIL
 
   [expected mismatch: .paltOFFkernON .cjk vs .paltONkernON .cjk]
     expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
       if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-family-name-025.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-family-name-025.html.ini
new file mode 100644
index 0000000..1ad5ad2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-family-name-025.html.ini
@@ -0,0 +1,2 @@
+[font-family-name-025.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-variant-emoji-2.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-variant-emoji-2.html.ini
new file mode 100644
index 0000000..68aae84
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-variant-emoji-2.html.ini
@@ -0,0 +1,2 @@
+[font-variant-emoji-2.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-002.html.ini
index eff5649..c1cee440 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-002.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-002.html.ini
@@ -1,3 +1,6 @@
 [generic-family-keywords-002.html]
   [font-family: -webkit-body treated as <font-family>, not <generic-name>]
     expected: FAIL
+
+  [font-family: BlinkMacSystemFont treated as <font-family>, not <generic-name>]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/standard-font-family.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/standard-font-family.html.ini
new file mode 100644
index 0000000..3bbe8a7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/standard-font-family.html.ini
@@ -0,0 +1,2 @@
+[standard-font-family.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ar.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ar.html.ini
new file mode 100644
index 0000000..d3343151
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ar.html.ini
@@ -0,0 +1,2 @@
+[system-ui-ar.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ur.html.ini b/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ur.html.ini
new file mode 100644
index 0000000..d9e58e1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/system-ui-ur.html.ini
@@ -0,0 +1,2 @@
+[system-ui-ur.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-item-auto-margins-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-item-auto-margins-001.html.ini
new file mode 100644
index 0000000..95c5dce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-item-auto-margins-001.html.ini
@@ -0,0 +1,2 @@
+[grid-item-auto-margins-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html.ini
new file mode 100644
index 0000000..8f2b0b76
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html.ini
@@ -0,0 +1,2 @@
+[grid-self-baseline-changes-grid-area-size-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-002.html.ini
new file mode 100644
index 0000000..dc21d53
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-002.html.ini
@@ -0,0 +1,2 @@
+[grid-inline-items-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-003.html.ini
new file mode 100644
index 0000000..a2ec623
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-items-003.html.ini
@@ -0,0 +1,2 @@
+[grid-inline-items-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-z-axis-ordering-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-z-axis-ordering-003.html.ini
new file mode 100644
index 0000000..837fbd2a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-inline-z-axis-ordering-003.html.ini
@@ -0,0 +1,2 @@
+[grid-inline-z-axis-ordering-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-008.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-008.html.ini
new file mode 100644
index 0000000..6e66a845
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-items-percentage-margins-008.html.ini
@@ -0,0 +1,2 @@
+[grid-items-percentage-margins-008.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-order-property-painting-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-order-property-painting-003.html.ini
new file mode 100644
index 0000000..9ccd8bd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-items/grid-order-property-painting-003.html.ini
@@ -0,0 +1,2 @@
+[grid-order-property-painting-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-001.html.ini
new file mode 100644
index 0000000..bf75afb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-001.html.ini
@@ -0,0 +1,2 @@
+[grid-floats-no-intrude-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-002.html.ini
new file mode 100644
index 0000000..62e3a1e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-float-002.html.ini
@@ -0,0 +1,2 @@
+[initial-letter-float-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-tab-rtl.html.ini b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-tab-rtl.html.ini
new file mode 100644
index 0000000..89079a8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-inline/initial-letter/initial-letter-with-tab-rtl.html.ini
@@ -0,0 +1,2 @@
+[initial-letter-with-tab-rtl.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-at-outer-boundary-as-legend.html.ini b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-at-outer-boundary-as-legend.html.ini
new file mode 100644
index 0000000..fd49a9f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-at-outer-boundary-as-legend.html.ini
@@ -0,0 +1,2 @@
+[nested-at-outer-boundary-as-legend.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-dynamic-auto-overflow.html.ini b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-dynamic-auto-overflow.html.ini
new file mode 100644
index 0000000..436ec4e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-dynamic-auto-overflow.html.ini
@@ -0,0 +1,2 @@
+[position-absolute-dynamic-auto-overflow.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-fit-content.html.ini b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-fit-content.html.ini
new file mode 100644
index 0000000..c8b541f3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-absolute-fit-content.html.ini
@@ -0,0 +1,2 @@
+[position-absolute-fit-content.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-position/position-relative-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-position/position-relative-004.html.ini
new file mode 100644
index 0000000..e0f31c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-position/position-relative-004.html.ini
@@ -0,0 +1,2 @@
+[position-relative-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-051.html.ini b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-051.html.ini
new file mode 100644
index 0000000..5c2dbfe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-051.html.ini
@@ -0,0 +1,2 @@
+[active-selection-051.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-052.html.ini b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-052.html.ini
new file mode 100644
index 0000000..0f901ff
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-052.html.ini
@@ -0,0 +1,2 @@
+[active-selection-052.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-053.html.ini b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-053.html.ini
new file mode 100644
index 0000000..c6473c5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-053.html.ini
@@ -0,0 +1,2 @@
+[active-selection-053.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-054.html.ini b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-054.html.ini
new file mode 100644
index 0000000..0daf575
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/active-selection-054.html.ini
@@ -0,0 +1,2 @@
+[active-selection-054.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-030.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-030.html.ini
new file mode 100644
index 0000000..7bdf8cc9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-030.html.ini
@@ -0,0 +1,2 @@
+[block-aspect-ratio-030.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-023.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-023.html.ini
new file mode 100644
index 0000000..0451d606
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-023.html.ini
@@ -0,0 +1,2 @@
+[flex-aspect-ratio-023.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-006.html.ini
new file mode 100644
index 0000000..6ddf93b6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-006.html.ini
@@ -0,0 +1,2 @@
+[grid-aspect-ratio-006.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/intrinsic-size-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/intrinsic-size-003.html.ini
new file mode 100644
index 0000000..0dd8c185
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/intrinsic-size-003.html.ini
@@ -0,0 +1,2 @@
+[intrinsic-size-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-007.html.ini
new file mode 100644
index 0000000..397bca2e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-007.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-016.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-016.html.ini
new file mode 100644
index 0000000..669a52a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-016.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-016.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-023.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-023.html.ini
new file mode 100644
index 0000000..388c41c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-023.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-023.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-029.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-029.html.ini
new file mode 100644
index 0000000..a175326
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/replaced-element-029.html.ini
@@ -0,0 +1,2 @@
+[replaced-element-029.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-004.html.ini
new file mode 100644
index 0000000..cc9369f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-004.html.ini
@@ -0,0 +1,2 @@
+[zero-or-infinity-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-007.html.ini
new file mode 100644
index 0000000..4cd0823
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/zero-or-infinity-007.html.ini
@@ -0,0 +1,2 @@
+[zero-or-infinity-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/box-shadow-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-tables/box-shadow-001.html.ini
new file mode 100644
index 0000000..fc97f559
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-tables/box-shadow-001.html.ini
@@ -0,0 +1,2 @@
+[box-shadow-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/textarea-intrinsic-size-crash.html.ini b/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/textarea-intrinsic-size-crash.html.ini
new file mode 100644
index 0000000..5f25315
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-tables/crashtests/textarea-intrinsic-size-crash.html.ini
@@ -0,0 +1,2 @@
+[textarea-intrinsic-size-crash.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphenate-character-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphenate-character-005.html.ini
new file mode 100644
index 0000000..ac67bac5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/hyphens/hyphenate-character-005.html.ini
@@ -0,0 +1,2 @@
+[hyphenate-character-005.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-001.html.ini
new file mode 100644
index 0000000..cca2292e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-001.html.ini
@@ -0,0 +1,2 @@
+[text-transform-shaping-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-002.html.ini
new file mode 100644
index 0000000..2ba2384
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-002.html.ini
@@ -0,0 +1,2 @@
+[text-transform-shaping-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-003.html.ini
new file mode 100644
index 0000000..7e956c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-shaping-003.html.ini
@@ -0,0 +1,2 @@
+[text-transform-shaping-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-newline-016.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-newline-016.html.ini
new file mode 100644
index 0000000..c329c7f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-newline-016.html.ini
@@ -0,0 +1,2 @@
+[break-spaces-newline-016.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-001.html.ini
new file mode 100644
index 0000000..6eea3f81
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-001.html.ini
@@ -0,0 +1,2 @@
+[control-chars-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-002.html.ini
new file mode 100644
index 0000000..d10c36f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-002.html.ini
@@ -0,0 +1,2 @@
+[control-chars-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-003.html.ini
new file mode 100644
index 0000000..d6f8a02
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-003.html.ini
@@ -0,0 +1,2 @@
+[control-chars-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-004.html.ini
new file mode 100644
index 0000000..ff8d343c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-004.html.ini
@@ -0,0 +1,2 @@
+[control-chars-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-005.html.ini
new file mode 100644
index 0000000..843ad12c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-005.html.ini
@@ -0,0 +1,2 @@
+[control-chars-005.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-006.html.ini
new file mode 100644
index 0000000..99865a1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-006.html.ini
@@ -0,0 +1,2 @@
+[control-chars-006.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-007.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-007.html.ini
new file mode 100644
index 0000000..508d995
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-007.html.ini
@@ -0,0 +1,2 @@
+[control-chars-007.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-008.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-008.html.ini
new file mode 100644
index 0000000..1738df48
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-008.html.ini
@@ -0,0 +1,2 @@
+[control-chars-008.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00B.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00B.html.ini
new file mode 100644
index 0000000..31eba84d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00B.html.ini
@@ -0,0 +1,2 @@
+[control-chars-00B.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00C.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00C.html.ini
new file mode 100644
index 0000000..0bc6acb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00C.html.ini
@@ -0,0 +1,2 @@
+[control-chars-00C.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00E.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00E.html.ini
new file mode 100644
index 0000000..3968f5f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00E.html.ini
@@ -0,0 +1,2 @@
+[control-chars-00E.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00F.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00F.html.ini
new file mode 100644
index 0000000..0b0d02c2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-00F.html.ini
@@ -0,0 +1,2 @@
+[control-chars-00F.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-010.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-010.html.ini
new file mode 100644
index 0000000..03e3087
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-010.html.ini
@@ -0,0 +1,2 @@
+[control-chars-010.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-011.html.ini
new file mode 100644
index 0000000..5eaef40
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-011.html.ini
@@ -0,0 +1,2 @@
+[control-chars-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-012.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-012.html.ini
new file mode 100644
index 0000000..bf2ff8b5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-012.html.ini
@@ -0,0 +1,2 @@
+[control-chars-012.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-013.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-013.html.ini
new file mode 100644
index 0000000..53cd0764
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-013.html.ini
@@ -0,0 +1,2 @@
+[control-chars-013.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-014.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-014.html.ini
new file mode 100644
index 0000000..9b0bbdf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-014.html.ini
@@ -0,0 +1,2 @@
+[control-chars-014.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-015.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-015.html.ini
new file mode 100644
index 0000000..416b69f4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-015.html.ini
@@ -0,0 +1,2 @@
+[control-chars-015.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-016.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-016.html.ini
new file mode 100644
index 0000000..c694224
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-016.html.ini
@@ -0,0 +1,2 @@
+[control-chars-016.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-017.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-017.html.ini
new file mode 100644
index 0000000..f520bc3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-017.html.ini
@@ -0,0 +1,2 @@
+[control-chars-017.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-018.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-018.html.ini
new file mode 100644
index 0000000..85e9573
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-018.html.ini
@@ -0,0 +1,2 @@
+[control-chars-018.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-019.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-019.html.ini
new file mode 100644
index 0000000..d992fd5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-019.html.ini
@@ -0,0 +1,2 @@
+[control-chars-019.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01A.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01A.html.ini
new file mode 100644
index 0000000..cfddeae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01A.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01A.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01B.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01B.html.ini
new file mode 100644
index 0000000..d1e0e6b9f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01B.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01B.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01C.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01C.html.ini
new file mode 100644
index 0000000..d8bdc44
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01C.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01C.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01D.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01D.html.ini
new file mode 100644
index 0000000..c986070
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01D.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01D.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01E.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01E.html.ini
new file mode 100644
index 0000000..748ef529
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01E.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01E.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01F.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01F.html.ini
new file mode 100644
index 0000000..82d2124
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/control-chars-01F.html.ini
@@ -0,0 +1,2 @@
+[control-chars-01F.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-019.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-019.html.ini
new file mode 100644
index 0000000..442e5e3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-019.html.ini
@@ -0,0 +1,2 @@
+[white-space-intrinsic-size-019.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-004.html.ini
new file mode 100644
index 0000000..5a01589
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/word-break/word-break-break-all-004.html.ini
@@ -0,0 +1,2 @@
+[word-break-break-all-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-button-border-block-end-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-button-border-block-end-style-001.html.ini
new file mode 100644
index 0000000..bf6d969
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-button-border-block-end-style-001.html.ini
@@ -0,0 +1,2 @@
+[kind-of-widget-fallback-input-button-border-block-end-style-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-bottom-color-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-bottom-color-001.html.ini
new file mode 100644
index 0000000..ab60e58
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-textarea-border-bottom-color-001.html.ini
@@ -0,0 +1,2 @@
+[kind-of-widget-fallback-textarea-border-bottom-color-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/outline-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-005.html.ini
new file mode 100644
index 0000000..d853f6c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-005.html.ini
@@ -0,0 +1,2 @@
+[outline-005.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/outline-color-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-color-001.html.ini
new file mode 100644
index 0000000..f169c53
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/outline-color-001.html.ini
@@ -0,0 +1,2 @@
+[outline-color-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-002.html.ini
new file mode 100644
index 0000000..e7ac97f9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-002.html.ini
@@ -0,0 +1,2 @@
+[ic-unit-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-003.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-003.html.ini
new file mode 100644
index 0000000..84a4b33
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-003.html.ini
@@ -0,0 +1,2 @@
+[ic-unit-003.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-009.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-009.html.ini
new file mode 100644
index 0000000..ec07962
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-009.html.ini
@@ -0,0 +1,2 @@
+[ic-unit-009.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-010.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-010.html.ini
new file mode 100644
index 0000000..ed3149ae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/ic-unit-010.html.ini
@@ -0,0 +1,2 @@
+[ic-unit-010.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-001.html.ini
new file mode 100644
index 0000000..0a4b494
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-001.html.ini
@@ -0,0 +1,2 @@
+[q-unit-case-insensitivity-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-002.html.ini
new file mode 100644
index 0000000..591cc38
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/q-unit-case-insensitivity-002.html.ini
@@ -0,0 +1,2 @@
+[q-unit-case-insensitivity-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht.ini
new file mode 100644
index 0000000..5e9dc1104
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-011.xht.ini
@@ -0,0 +1,2 @@
+[abs-pos-non-replaced-icb-vlr-011.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-021.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-021.xht.ini
new file mode 100644
index 0000000..1e30480a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-021.xht.ini
@@ -0,0 +1,2 @@
+[abs-pos-non-replaced-icb-vlr-021.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010.xht.ini
new file mode 100644
index 0000000..c14a6f604
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vrl-010.xht.ini
@@ -0,0 +1,2 @@
+[abs-pos-non-replaced-icb-vrl-010.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-embed-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-embed-011.html.ini
new file mode 100644
index 0000000..24d8182d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-embed-011.html.ini
@@ -0,0 +1,2 @@
+[bidi-embed-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-isolate-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-isolate-011.html.ini
new file mode 100644
index 0000000..406eb5a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-isolate-011.html.ini
@@ -0,0 +1,2 @@
+[bidi-isolate-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-normal-011.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-normal-011.html.ini
new file mode 100644
index 0000000..43b7578
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-normal-011.html.ini
@@ -0,0 +1,2 @@
+[bidi-normal-011.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-override-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-override-006.html.ini
new file mode 100644
index 0000000..4fcb4f0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-override-006.html.ini
@@ -0,0 +1,2 @@
+[bidi-override-006.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-plaintext-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-plaintext-001.html.ini
new file mode 100644
index 0000000..c62a291
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/bidi-plaintext-001.html.ini
@@ -0,0 +1,2 @@
+[bidi-plaintext-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/different-block-flow-dir-002.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/different-block-flow-dir-002.xht.ini
new file mode 100644
index 0000000..de7b6a5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/different-block-flow-dir-002.xht.ini
@@ -0,0 +1,2 @@
+[different-block-flow-dir-002.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/mongolian-orientation-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/mongolian-orientation-002.html.ini
new file mode 100644
index 0000000..432215e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/mongolian-orientation-002.html.ini
@@ -0,0 +1,2 @@
+[mongolian-orientation-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/font-family-serialization-001.html.ini b/third_party/blink/web_tests/external/wpt/css/cssom/font-family-serialization-001.html.ini
index d39aade..32f02aa 100644
--- a/third_party/blink/web_tests/external/wpt/css/cssom/font-family-serialization-001.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/cssom/font-family-serialization-001.html.ini
@@ -1,3 +1,6 @@
 [font-family-serialization-001.html]
+  [Serialization of NonGenericFontFamilyName,-webkit-body,-webkit-standard,-webkit-pictograph,BlinkMacSystemFont]
+    expected: FAIL
+
   [Serialization of quoted "<generic-family>"]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-001.html.ini b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-001.html.ini
new file mode 100644
index 0000000..2a9a0ab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-001.html.ini
@@ -0,0 +1,2 @@
+[mq-gamut-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-004.html.ini b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-004.html.ini
new file mode 100644
index 0000000..bbf1d6b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-gamut-004.html.ini
@@ -0,0 +1,2 @@
+[mq-gamut-004.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/bold.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/bold.html.ini
index 7cc2347a..4661c3f 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/bold.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/bold.html.ini
@@ -1,8 +1,975 @@
-[bold.html?2001-3000]
-  [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" compare innerHTML]
+[bold.html?1-1000]
+  [[["bold",""\]\] "<b>foo</b>[bar\]<strong>baz</strong>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["bold",""\]\] "<b>foo</b>[bar\]<strong>baz</strong>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<b>foo[\]bar</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<b>foo[\]bar</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<i>foo[\]bar</i>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<i>foo[\]bar</i>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>\]az</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>\]az</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>b\]ar</span>baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>b\]ar</span>baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b\]az</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b\]az</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>": execCommand("bold", false, "") return value]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<strong>foo</strong>[bar\]<strong>baz</strong>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<strong>foo</strong>[bar\]<strong>baz</strong>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "[foo\]<b>bar</b>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "[foo\]<b>bar</b>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "[foo\]<strong>bar</strong>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "[foo\]<strong>bar</strong>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz": execCommand("bold", false, "") return value]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<b>bar</b>[baz\]" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<b>bar</b>[baz\]" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<span contenteditable=false>[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<span contenteditable=false>[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<span contenteditable=false>ba[r</span>b\]az" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<span contenteditable=false>ba[r</span>b\]az" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>[bar</strong>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>[bar</strong>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>[bar\]</strong>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>[bar\]</strong>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>bar</strong>[baz\]" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo<strong>bar</strong>[baz\]" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[<strong>bar</strong>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[<strong>bar</strong>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[<strong>bar\]</strong>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[<strong>bar\]</strong>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[\]bar" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[\]bar" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandIndeterm("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<b></b>}baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<b></b>}baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<b><i></i></b>}baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<b><i></i></b>}baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<i></i>}baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<i></i>}baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<i><b></b></i>}baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo{<i><b></b></i>}baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+
+[bold.html?1001-2000]
+  [[["bold",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandIndeterm("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" compare innerHTML]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandIndeterm("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandState("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "{<span style=\\"font-weight: 900\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "{<span style=\\"font-weight: 900\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandState("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandState("stylewithcss") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
+
+[bold.html?2001-3000]
+  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" compare innerHTML]
     expected: FAIL
 
   [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" queryCommandState("bold") after]
@@ -11,964 +978,562 @@
   [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<font color=blue face=monospace><b>foo</b></font>[bar\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandIndeterm("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandIndeterm("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<b>b\]ar</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<b>b\]ar</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span style=font-weight:800>fo[o</span><span style=font-weight:900>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[barbaz</span>}" queryCommandValue("bold") before]
     expected: FAIL
 
   [[["bold",""\]\] "<span style=font-weight:800>fo[o</span><span style=font-weight:900>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "<span style=font-weight:800>fo[o</span><span style=font-weight:900>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") after]
+  [[["bold",""\]\] "fo[o<b>b\]ar</b>baz" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" compare innerHTML]
+  [[["bold",""\]\] "fo[o<b>b\]ar</b>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "fo[o<b>b\]ar</b>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") after]
+  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") after]
+  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" compare innerHTML]
+  [[["bold",""\]\] "fo[o<span style=font-weight:bold>b\]ar</span>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") after]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" compare innerHTML]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandState("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") before]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandState("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") after]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" compare innerHTML]
+  [[["bold",""\]\] "foo<b>ba[r</b>b\]az" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-
-[bold.html?1001-2000]
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandState("stylewithcss") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandState("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandState("stylewithcss") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") before]
-    expected: FAIL
+  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandIndeterm("bold") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") after]
-    expected: FAIL
+  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandState("bold") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b><p>foo[<i>bar</i>}</p><p>baz</p></b>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["bold",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["bold",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["bold",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" compare innerHTML]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<b id=purple>bar [baz\] qoz</b>" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandState("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 100\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandState("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 200\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 300\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","false"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>[foo\]</span></b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b><span class=notbold>foo[bar\]baz</span></b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 500\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 600\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">[bar\]</span>baz</b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo<span style=\\"font-weight: normal\\">bar<b>[baz\]</b>quz</span>qoz</b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>[foobarbaz\]</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 800\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[bar\]baz</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 900\\">[bar\]</span>baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<h3>foo[barbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<b>baz</b>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 400\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<i><b>foo</b></i>[bar\]<i><b>baz</b></i>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: 700\\">[bar</span>\]baz" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<p style=\\"font-weight: bold\\">foo[bar\]baz</p>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 400\\">bar</span>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<span style=\\"font-weight: 700\\">bar</span>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:200>fo[o</span><span style=font-weight:300>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:300>fo[o</span><span style=font-weight:400>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:400>fo[o</span><span style=font-weight:500>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 900\\">foo[bar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:500>fo[o</span><span style=font-weight:600>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:600>fo[o</span><span style=font-weight:700>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "<span style=font-weight:700>fo[o</span><span style=font-weight:800>b\]ar</span>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 100\\">foobar\]baz</span>" queryCommandValue("bold") after]
-    expected: FAIL
+  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandIndeterm("bold") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" compare innerHTML]
-    expected: FAIL
+  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandState("bold") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "[foo<span class=notbold>bar</span>baz\]" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 400\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<b>bar</b>b\]az" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>ba[r</b>\]baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "{<span style=\\"font-weight: 700\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: normal\\"><b>{bar}</b></span>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["bold",""\]\] "{<span style=\\"font-weight: 900\\">foobar\]baz</span>" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" compare innerHTML]
     expected: FAIL
 
-  [[["bold",""\]\] "{<span style=\\"font-weight: 900\\">foobar\]baz</span>" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>b\]ar</b>baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "foo{<b>bar</b>}baz" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandIndeterm("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 100\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandState("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandState("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<b>foo</b> <b>bar</b>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foo</h3><b>bar</b>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 400\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobar\]baz</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" compare innerHTML]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz</h3>}" queryCommandValue("bold") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") before]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=\\"font-weight: 700\\">foo[barbaz</span>}" queryCommandValue("bold") after]
+  [[["stylewithcss","true"\],["bold",""\]\] "{<h3>foobarbaz\]</h3>" queryCommandValue("bold") before]
     expected: FAIL
 
 
 [bold.html?3001-last]
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandState("stylewithcss") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandState("bold") after]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandState("stylewithcss") after]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") after]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["bold",""\]\] "<span style=font-weight:100>fo[o</span><span style=font-weight:200>b\]ar</span>" queryCommandValue("bold") before]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["bold",""\]\] "abc<b>[d<span contenteditable=\\"false\\"><b>e</b></span>f\]</b>ghi" compare innerHTML]
     expected: FAIL
 
@@ -980,488 +1545,3 @@
 
   [[["stylewithcss","false"\],["bold",""\]\] "abc{<i>def</i>}ghi" compare innerHTML]
     expected: FAIL
-
-
-[bold.html?1-1000]
-  [[["bold",""\]\] "foo[\]bar" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[\]bar" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<b>foo[\]bar</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<b>foo[\]bar</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<i>foo[\]bar</i>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<i>foo[\]bar</i>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<span contenteditable=false>[bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<span contenteditable=false>[bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[o<span contenteditable=false>bar</span>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<span contenteditable=false>ba[r</span>b\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<span contenteditable=false>ba[r</span>b\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz": execCommand("bold", false, "") return value]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "fo[o<span contenteditable=false>b\]ar</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>\]az" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>[bar\]</span>baz</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b\]az</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b\]az</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>": execCommand("bold", false, "") return value]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b\]az</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>b\]ar</span>baz</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[o<span contenteditable=true>b\]ar</span>baz</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>\]az</span>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>\]az</span>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<span style=\\"font-weight: bold\\">[bar\]</span>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar\]</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<b>bar</b>[baz\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<b>bar</b>[baz\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "[foo\]<b>bar</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "[foo\]<b>bar</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<b>foo</b>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>bar</strong>[baz\]" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>bar</strong>[baz\]" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "[foo\]<strong>bar</strong>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "[foo\]<strong>bar</strong>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<strong>foo</strong>[bar\]<strong>baz</strong>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<strong>foo</strong>[bar\]<strong>baz</strong>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "<b>foo</b>[bar\]<strong>baz</strong>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "<b>foo</b>[bar\]<strong>baz</strong>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "<strong>foo</strong>[bar\]<b>baz</b>" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo[<b>bar\]</b>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["bold",""\]\] "foo<b>[bar</b>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<b></b>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<b></b>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<i></i>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<i></i>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<b><i></i></b>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<b><i></i></b>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<i><b></b></i>}baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo{<i><b></b></i>}baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>[bar\]</strong>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>[bar\]</strong>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[<strong>bar</strong>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[<strong>bar</strong>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[<strong>bar\]</strong>baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo[<strong>bar\]</strong>baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>[bar</strong>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["bold",""\]\] "foo<strong>[bar</strong>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["bold",""\]\] "foo[<span style=\\"font-weight: bold\\">bar</span>\]baz" queryCommandValue("bold") after]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
index 2e18381..dfde04d 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/delete.html.ini
@@ -1,456 +1,11 @@
-[delete.html?2001-3000]
-  [[["delete",""\]\] "foo<blockquote>[\]bar</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><blockquote>[\]bar</blockquote></blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><div>[\]bar</div></blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\">[\]bar</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\">[\]bar</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><blockquote><p>[\]bar<p>baz</blockquote></blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><div><p>[\]bar<p>baz</div></blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\"><p>[\]bar<p>baz</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\"><p>[\]bar<p>baz</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><p><b>[\]bar</b><p>baz</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><p><strong>[\]bar</strong><p>baz</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><p><span>[\]bar</span><p>baz</blockquote>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote><ol><li>[\]bar</ol></blockquote><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote><ol><li>[\]bar</ol></blockquote><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote>bar<ol><li>[\]baz</ol>quz</blockquote><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote>bar<ol><li>[\]baz</ol>quz</blockquote><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<blockquote><ol><li>bar</li><ol><li>[\]baz</ol><li>quz</ol></blockquote><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:brown>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:brown>[\]bar" compare innerHTML]
-    expected: FAIL
-
-
-[delete.html?1001-2000]
-  [[["delete",""\]\] "<p>foo<table><tr><td>bar</table><p>[\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<br><table><tr><td>[\]bar</table>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<p>foo<table><tr><td>bar<br></table><p>[\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tr><td>foo<br><td>[\]bar</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tr><td>foo<br><tr><td>[\]bar</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<p>foo<table><tr><td>bar<br><br></table><p>[\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<li>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<br><li>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<br><br><li>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<li>[\]bar<br>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<br>bar<li>[\]baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li><p>foo<li>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<li><p>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li><p>foo<li><p>[\]bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<ul><li>[\]bar</ul></ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<ol><ol><li>[\]bar</ol></ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<div><ol><li>[\]bar</ol></div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<div><ol><li>[\]bar</ol></div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<dl><dt>[\]bar<dd>baz</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<dl><dt>[\]bar<dd>baz</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<dl><dd>[\]bar</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<dl><dd>[\]bar</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<dl><dt>foo<dd>[\]bar</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<dl><dt>foo<dt>[\]bar<dd>baz</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<dl><dt>foo<dd>bar<dd>[\]baz</dl>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<br><br></ol>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li><br></ol>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo<li><br></ol>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo<br><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo<br><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo<li><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo<li><br></ol><p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-
-[delete.html?6001-7000]
-  [[["delete",""\]\] "<ol><li>fo[o</ol><ol><li>b\]ar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["delete",""\]\] "<span style=display:block>fo[o</span><span style=display:block>b\]ar</span>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["delete",""\]\] "<span style=display:none>fo[o</span><span style=display:none>b\]ar</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["delete",""\]\] "<quasit style=display:block>fo[o</quasit><quasit style=display:block>b\]ar</quasit>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["delete",""\]\] "<quasit style=display:block>fo[o</quasit><quasit style=display:block>b\]ar</quasit>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo[</ol>bar\]<ol><li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><p>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><p>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo</ol>[bar<ol><li>\]baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li>\]baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li><p>\]baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li><p>\]baz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><ol><li>foo[</ol><li>bar</ol>baz\]<ol><li>quz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<ol><li>foo[<li>bar\]</ol><ol><li>baz</ol><ol><li>quz</ol>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<div><b>[foo\]</b></div>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<img contenteditable=false src=/img/lion.svg>[\]bar" compare innerHTML]
-    expected: FAIL
-
-
-[delete.html?3001-4000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[\]bar" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=color:brown>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=color:brown>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p><font color=brown>[\]bar</font>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p><font color=brown>[\]bar</font>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
-    expected: FAIL
-
-
-[delete.html?5001-6000]
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<div>foo[bar</div><p>baz\]quz" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<div><p>foo<p>[bar<p>baz\]</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<div><p>foo<p>[bar<p>baz\]</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[</p><p>\]bar<br>baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo[</p><p>\]bar<br>baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo<p>{bar</p>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<p>foo<br><br>{</p>\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><br>{<p>\]bar</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><br>{<p>\]bar</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tbody><tr><th>fo[o<th>bar<th>b\]az<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tbody><tr><th>[foo<th>bar<th>baz\]<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz\]</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q\]oz<td>qiz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<p>foo<table><tr><td>ba[r</table><p>b\]az" compare innerHTML]
-    expected: FAIL
-
-
 [delete.html?1-1000]
-  [[["delete",""\]\] "<span>foo[</span><span>\]bar</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["delete",""\]\] "foo<span style=display:none>bar</span>[\]baz" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
   [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<br><br></p><p>[\]bar</p>" compare innerHTML]
     expected: FAIL
 
   [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<br><br></p><p>[\]bar</p>" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<p>foo<br><br></p>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<a>foo</a>[\]bar" compare innerHTML]
+  [[["delete",""\]\] "<a href=/ name=abc>foo</a>[\]bar" compare innerHTML]
     expected: FAIL
 
   [[["delete",""\]\] "<a href=/>foo</a>[\]bar" compare innerHTML]
@@ -459,25 +14,7 @@
   [[["delete",""\]\] "<a name=abc>foo</a>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<a href=/ name=abc>foo</a>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<span><a>foo</a></span>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<span><a href=/>foo</a></span>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<span><a name=abc>foo</a></span>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "<span><a href=/ name=abc>foo</a></span>[\]bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo <span>&nbsp;</span>[\] bar" compare innerHTML]
-    expected: FAIL
-
-  [[["delete",""\]\] "foo <span>&nbsp;</span> [\]bar" compare innerHTML]
+  [[["delete",""\]\] "<a>foo</a>[\]bar" compare innerHTML]
     expected: FAIL
 
   [[["delete",""\]\] "<b>foo&nbsp;</b> [\]bar" compare innerHTML]
@@ -486,65 +23,381 @@
   [[["delete",""\]\] "<b>foo&nbsp;</b>&nbsp;[\]bar" compare innerHTML]
     expected: FAIL
 
-
-[delete.html?7001-last]
-  [[["delete",""\]\] "<div style=white-space:pre-line>foo\\n\\n[\]bar</div>" compare innerHTML]
+  [[["delete",""\]\] "<p>foo<br><br></p>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<div style=white-space:pre-line>foo\\nb[\]</div>" compare innerHTML]
+  [[["delete",""\]\] "<span><a href=/ name=abc>foo</a></span>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<div style=white-space:nowrap>foo\\nb[\]</div>" compare innerHTML]
+  [[["delete",""\]\] "<span><a href=/>foo</a></span>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+  [[["delete",""\]\] "<span><a name=abc>foo</a></span>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+  [[["delete",""\]\] "<span><a>foo</a></span>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=3>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+  [[["delete",""\]\] "<span>foo[</span><span>\]bar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=3>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+  [[["delete",""\]\] "foo <span>&nbsp;</span> [\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=4>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+  [[["delete",""\]\] "foo <span>&nbsp;</span>[\] bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=4>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+  [[["stylewithcss","true"\],["delete",""\]\] "foo<span style=display:none>bar</span>[\]baz" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+
+[delete.html?1001-2000]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><br></ol><p>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo<br><br></ol><p>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=5>foo</font><p><font color=blue>[\]bar</font>" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo<li><br></ol><p>[\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=5>foo</font><p><font color=blue>[\]bar</font>" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font face=monospace>foo</font><p><font face=sans-serif>[\]bar</font>" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
     expected: FAIL
 
-  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font face=monospace>foo</font><p><font face=sans-serif>[\]bar</font>" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<div><ol><li>[\]bar</ol></div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<dl><dd>[\]bar</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<dl><dt>[\]bar<dd>baz</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><br></ol><p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo<br><br></ol><p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo<li><br></ol><p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><ol><li>[\]bar<li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<div><ol><li>[\]bar</ol></div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<dl><dd>[\]bar</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<dl><dt>[\]bar<dd>baz</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<ol><li>[\]bar<li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<dl><dt>foo<dd>[\]bar</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<dl><dt>foo<dd>bar<dd>[\]baz</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<dl><dt>foo<dt>[\]bar<dd>baz</dl>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li><br></ol>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li><p>foo<li><p>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li><p>foo<li>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<br><br></ol>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<br><br><li>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<br><li>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<br>bar<li>[\]baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<li><br></ol>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<li><p>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<li>[\]bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<li>[\]bar<br>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo<ul><li>[\]bar</ul></ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<p>foo<table><tr><td>bar</table><p>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<p>foo<table><tr><td>bar<br></table><p>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<p>foo<table><tr><td>bar<br><br></table><p>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<table><tr><td>foo<br><td>[\]bar</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<table><tr><td>foo<br><tr><td>[\]bar</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<br><table><tr><td>[\]bar</table>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<ol><ol><li>[\]bar</ol></ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<table><tr><td>bar</table>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<table><tr><td>bar<br></table>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<table><tr><td>bar<br><br></table>[\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<table><tr><td>bar<hr></table>[\]baz" compare innerHTML]
+    expected: FAIL
+
+
+[delete.html?2001-3000]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\"><p>[\]bar<p>baz</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\">[\]bar</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote><ol><li>[\]bar</ol></blockquote><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<blockquote>bar<ol><li>[\]baz</ol>quz</blockquote><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\"><p>[\]bar<p>baz</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote style=\\"color: blue\\">[\]bar</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote><ol><li>[\]bar</ol></blockquote><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<blockquote>bar<ol><li>[\]baz</ol>quz</blockquote><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><blockquote><p>[\]bar<p>baz</blockquote></blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><blockquote>[\]bar</blockquote></blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><div><p>[\]bar<p>baz</div></blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><div>[\]bar</div></blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><ol><li>bar</li><ol><li>[\]baz</ol><li>quz</ol></blockquote><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><p><b>[\]bar</b><p>baz</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><p><span>[\]bar</span><p>baz</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote><p><strong>[\]bar</strong><p>baz</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<blockquote>[\]bar</blockquote>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+
+[delete.html?3001-4000]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=background-color:aqua>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[\]bar" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=text-decoration:underline>foo<p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=background-color:tan>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" compare innerHTML]
     expected: FAIL
 
 
 [delete.html?4001-5000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" queryCommandState("stylewithcss") after]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p><u>foo</u><p>[\]bar" queryCommandValue("defaultparagraphseparator") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" queryCommandValue("defaultparagraphseparator") before]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<p>foo</p><p>{bar</p>}<p>baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<div style=color:brown><p style=color:green>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<div style=color:brown><p style=color:green>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" queryCommandState("stylewithcss") after]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" queryCommandValue("defaultparagraphseparator") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p><u>foo</u><p>[\]bar" queryCommandValue("defaultparagraphseparator") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<p style=text-decoration:line-through>[\]bar" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "foo<p style=color:brown>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["delete",""\]\] "<p style=color:blue>foo</p>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div>[\]bar" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["delete",""\]\] "<p style=color:blue>foo</p>[\]bar" compare innerHTML]
@@ -553,44 +406,203 @@
   [[["stylewithcss","true"\],["delete",""\]\] "<p style=color:blue>foo</p>[\]bar" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["delete",""\]\] "<p style=color:blue>foo</p>[\]bar" compare innerHTML]
+
+[delete.html?5001-6000]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<div><p>foo<p>[bar<p>baz\]</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "foo<p style=color:brown>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<div>foo[bar</div><p>baz\]quz" queryCommandValue("defaultparagraphseparator") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "foo<p style=color:brown>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[</p><p>\]bar<br>baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "foo<br><br>{<p>\]bar</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<div><p>foo<p>[bar<p>baz\]</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p style=color:blue>foo<div style=color:brown><p style=color:green>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo[</p><p>\]bar<br>baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p style=color:blue>foo<div style=color:brown><p style=color:green>[\]bar" compare innerHTML]
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "foo<br><br>{<p>\]bar</p>" compare innerHTML]
     expected: FAIL
 
-  [[["delete",""\]\] "<p>foo</p><p>{bar</p>}<p>baz</p>" compare innerHTML]
+  [[["delete",""\]\] "<p>foo<br><br>{</p>\]bar" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTML]
+  [[["delete",""\]\] "<p>foo<table><tr><td>ba[r</table><p>b\]az" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTML]
+  [[["delete",""\]\] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q\]oz<td>qiz</table>" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTML]
+  [[["delete",""\]\] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz\]</table>" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTML]
+  [[["delete",""\]\] "<table><tbody><tr><th>[foo<th>bar<th>baz\]<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<table><tbody><tr><th>fo[o<th>bar<th>b\]az<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<p>{bar</p>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p>foo[bar<p style=color:blue>baz\]quz" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+
+[delete.html?6001-7000]
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li><p>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li><p>\]baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ol><li>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["delete",""\]\] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li><p>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li><p>\]baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ol><li>foo[</ol><p>bar\]<ol><li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["delete",""\]\] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<div><b>[foo\]</b></div>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>fo[o</ol><ol><li>b\]ar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo</ol><p>[bar<ol><li>\]baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo</ol>[bar<ol><li>\]baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo[</ol>bar\]<ol><li>baz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><li>foo[<li>bar\]</ol><ol><li>baz</ol><ol><li>quz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ol><ol><li>foo[</ol><li>bar</ol>baz\]<ol><li>quz</ol>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<span style=display:none>fo[o</span><span style=display:none>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "foo<img contenteditable=false src=/img/lion.svg>[\]bar" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["delete",""\]\] "<quasit style=display:block>fo[o</quasit><quasit style=display:block>b\]ar</quasit>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["delete",""\]\] "<quasit style=display:block>fo[o</quasit><quasit style=display:block>b\]ar</quasit>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["delete",""\]\] "<span style=display:block>fo[o</span><span style=display:block>b\]ar</span>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+
+[delete.html?7001-last]
+  [[["delete",""\]\] "<div style=white-space:nowrap>foo\\nb[\]</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<div style=white-space:pre-line>foo\\n\\n[\]bar</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["delete",""\]\] "<div style=white-space:pre-line>foo\\nb[\]</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font face=monospace>foo</font><p><font face=sans-serif>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=3>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=4>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","div"\],["delete",""\]\] "<p><font size=5>foo</font><p><font color=blue>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font color=brown>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font color=blue>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font face=monospace>foo</font><p><font face=sans-serif>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=3>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=4>foo</font><p><font size=5>[\]bar</font>" compare innerHTML]
+    expected: FAIL
+
+  [[["styleWithCSS","false"\],["defaultparagraphseparator","p"\],["delete",""\]\] "<p><font size=5>foo</font><p><font color=blue>[\]bar</font>" compare innerHTML]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/italic.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/italic.html.ini
index 84235f31..9ebafea 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/italic.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/italic.html.ini
@@ -1,688 +1,80 @@
-[italic.html?1001-2000]
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo [bar <i>baz\] qoz</i> quz sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo [bar <i>baz\] qoz</i> quz sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "fo[o<i>b\]ar</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "fo[o<i>b\]ar</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" compare innerHTML]
-    expected: FAIL
-
-
 [italic.html?1-1000]
-  [[["italic",""\]\] "foo[\]bar" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo[\]bar" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") after]
+  [[["italic",""\]\] "<b>foo[\]bar</b>" queryCommandValue("italic") after]
     expected: FAIL
 
   [[["italic",""\]\] "<b>foo[\]bar</b>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["italic",""\]\] "<b>foo[\]bar</b>" queryCommandValue("italic") after]
+  [[["italic",""\]\] "<i>foo[\]bar</i>" queryCommandValue("italic") after]
     expected: FAIL
 
   [[["italic",""\]\] "<i>foo[\]bar</i>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["italic",""\]\] "<i>foo[\]bar</i>" queryCommandValue("italic") after]
+  [[["italic",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("italic") after]
     expected: FAIL
 
   [[["italic",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["italic",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("italic") after]
+  [[["italic",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("italic") after]
     expected: FAIL
 
   [[["italic",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["italic",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("italic") after]
+  [[["italic",""\]\] "foo<em>[bar\]</em>baz" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") before]
+  [[["italic",""\]\] "foo<em>[bar\]</em>baz" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") after]
+  [[["italic",""\]\] "foo[\]bar" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") before]
+  [[["italic",""\]\] "foo[\]bar" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("italic") before]
+  [[["italic",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandIndeterm("italic") before]
     expected: FAIL
 
   [[["italic",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") before]
+  [[["italic",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") after]
+  [[["italic",""\]\] "foo{<em>bar</em>}baz" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") before]
+  [[["italic",""\]\] "foo{<em>bar</em>}baz" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("italic") after]
@@ -691,16 +83,189 @@
   [[["stylewithcss","false"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" compare innerHTML]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") before]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandState("italic") before]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("italic") after]
@@ -709,276 +274,982 @@
   [[["stylewithcss","false"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["italic",""\]\] "foo<em>[bar\]</em>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["italic",""\]\] "foo<em>[bar\]</em>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["italic",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandState("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandState("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo{<em>bar</em>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["italic",""\]\] "foo{<em>bar</em>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandIndeterm("italic") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<address>bar</address>b\]az" queryCommandValue("italic") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandIndeterm("italic") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<cite>bar</cite>b\]az" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>[bar\]</address>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<address>b[a\]r</address>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>[bar\]</cite>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<cite>b[a\]r</cite>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>[bar\]</dfn>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<dfn>b[a\]r</dfn>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<em>b[a\]r</em>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>b[a\]r</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>[bar\]</var>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<var>b[a\]r</var>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[bar\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" compare innerHTML]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandIndeterm("italic") before]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandState("italic") before]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<address>bar</address>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<cite>bar</cite>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<dfn>bar</dfn>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<var>bar</var>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("italic") before]
+    expected: FAIL
+
+
+[italic.html?1001-2000]
+  [[["italic",""\]\] "fo[o<i>b\]ar</i>baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<i>b\]ar</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<i>b\]ar</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "fo[o<span style=font-style:italic>b\]ar</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo [bar <i>baz\] qoz</i> quz sic" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo [bar <i>baz\] qoz</i> quz sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo [bar <i>baz\] qoz</i> quz sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" compare innerHTML]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo bar <i>baz [qoz</i> quz\] sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" compare innerHTML]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["italic",""\]\] "foo<i>ba[r</i>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i><p>foo[<b>bar</b>}</p><p>baz</p></i>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<address>bar</address>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<cite>bar</cite>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<dfn>bar</dfn>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<em>bar</em>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<i>bar</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "[foo<var>bar</var>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<dfn>bar</dfn>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<em>bar</em>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<i>bar</i>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<span style=font-style:oblique>b\]ar</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "fo[o<var>bar</var>b\]az" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo [bar <b>baz\] qoz</b> quz sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo bar <b>baz [qoz</b> quz\] sic" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>[bar\]</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<i>ba[r</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: italic\\">[bar\]</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">[bar\]</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo<span style=\\"font-style: oblique\\">b[a\]r</span>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<address>bar</address>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<cite>bar</cite>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<dfn>bar</dfn>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<em>bar</em>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>b\]ar</i>baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>\]baz" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandState("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<i>bar</i>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandIndeterm("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") after]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandState("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo[<var>bar</var>baz\]" queryCommandValue("italic") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "foo{<i>bar</i>}baz" queryCommandValue("italic") before]
     expected: FAIL
 
 
 [italic.html?2001-last]
-  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandState("italic") after]
@@ -987,35 +1258,32 @@
   [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b\]ar</span>" queryCommandValue("italic") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") before]
+  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") after]
+  [[["stylewithcss","false"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") before]
+  [[["stylewithcss","true"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["italic",""\]\] "<i>fo[o</i><address>b\]ar</address>" queryCommandValue("italic") after]
+  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["italic",""\]\] "<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b\]ar</span>" queryCommandValue("italic") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/justifycenter.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/justifycenter.html.ini
index 2610e9c..d52d5164 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/justifycenter.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/justifycenter.html.ini
@@ -1,2172 +1,396 @@
-[justifycenter.html?5001-6000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-
-[justifycenter.html?4001-5000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("stylewithcss") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
-    expected: FAIL
-
-
 [justifycenter.html?1-1000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
+  [[["justifycenter",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
   [[["justifycenter",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-
-[justifycenter.html?3001-4000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandState("stylewithcss") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
 
 [justifycenter.html?1001-2000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
     expected: FAIL
 
@@ -2176,27 +400,117 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
     expected: FAIL
 
@@ -2206,323 +520,390 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-
-[justifycenter.html?6001-last]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandState("stylewithcss") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("defaultparagraphseparator") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandState("stylewithcss") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
 
 [justifycenter.html?2001-3000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") after]
+  [[["justifycenter",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["justifycenter",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody align=center><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody align=center><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody align=center><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+  [[["justifycenter",""\]\] "<table><tbody align=center><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["justifycenter",""\]\] "<table><tbody><tr align=center><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
@@ -2531,49 +912,73 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -2585,205 +990,10 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -2795,25 +1005,124 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -2825,128 +1134,1939 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["justifycenter",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+
+[justifycenter.html?3001-4000]
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<div align=center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<div align=center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div align=center><p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]<div style=text-align:center><p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div align=center>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "[foo\]<div style=text-align:center>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<center>baz</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>foo</center>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>foo</div>[bar\]<div style=text-align:center>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "[foo\]<center>bar</center><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+
+[justifycenter.html?4001-5000]
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>[foo\]</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<span style=text-align:center>f[o\]o</span><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("stylewithcss") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>[foo</center>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center>fo[o</center>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div><p>[bar\]<div style=text-align:center><p>baz</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p align=center>baz<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p align=center>foo<p>[bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]<p align=center>bar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<quasit align=right><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>[foo</div>bar\]<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=center>fo[o</div>b\]ar<p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifycenter",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+
+[justifycenter.html?5001-6000]
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div align=center><p>bar</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["justifycenter",""\]\] "<p>[foo\]</p> <div style=text-align:center><p>bar</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center>{<div align=left>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><!-- bar -->}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandIndeterm("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandState("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>bar}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=left>{<div align=center>foo</div>}</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<p>[foo\]</p> <center><p>bar</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+
+[justifycenter.html?6001-last]
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div align=center><p>foo</div> <p>[bar\]</p> <div align=center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandState("stylewithcss") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<div style=text-align:center><p>foo</div> <p>[bar\]</p> <div style=text-align:center><p>baz</div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifycenter",""\]\] "<center><p>foo</center> <p>[bar\]</p> <center><p>baz</center>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:center><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/justifyfull.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/justifyfull.html.ini
index f9fc9a7d..3721a543 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/justifyfull.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/justifyfull.html.ini
@@ -1,1517 +1,393 @@
-[justifyfull.html?2001-3000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+[justifyfull.html?1-1000]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-
-[justifyfull.html?3001-4000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
 
 [justifyfull.html?1001-2000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
     expected: FAIL
 
@@ -1521,10 +397,334 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
@@ -1533,503 +733,1210 @@
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
     expected: FAIL
 
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+
+[justifyfull.html?2001-3000]
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody align=justify><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<table><tbody><tr align=justify><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+
+[justifyfull.html?3001-4000]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<div align=justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<div align=justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div align=justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
 
-[justifyfull.html?1-1000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
+  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "<p>[foo\]<div align=justify><p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "<p>[foo\]<div style=text-align:justify><p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" compare innerHTML]
+  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "[foo\]<div align=justify>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" compare innerHTML]
+  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "[foo\]<div style=text-align:justify>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div><p>[bar\]<div style=text-align:justify><p>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>foo</div>[bar\]<div style=text-align:justify>baz</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
 
 [justifyfull.html?4001-last]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandState("justifyfull") after]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandState("stylewithcss") before]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" compare innerHTML]
@@ -2038,22 +1945,10 @@
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandState("justifyfull") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandState("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" compare innerHTML]
@@ -2062,10 +1957,49 @@
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandState("justifyfull") before]
     expected: FAIL
 
+  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
   [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>[foo\]</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" compare innerHTML]
@@ -2074,245 +2008,347 @@
   [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandState("justifyfull") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") after]
+  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<span style=text-align:justify>f[o\]o</span><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" compare innerHTML]
+  [[["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["justifyfull",""\]\] "<p>[foo\]</p> <div align=justify><p>bar</div>" compare innerHTML]
     expected: FAIL
 
-  [[["justifyfull",""\]\] "<p>[foo\]</p> <div align=justify><p>bar</div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["justifyfull",""\]\] "<p>[foo\]</p> <div align=justify><p>bar</div>" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
+  [[["justifyfull",""\]\] "<p>[foo\]</p> <div align=justify><p>bar</div>" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
+  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
+  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["justifyfull",""\]\] "<p>[foo\]</p> <div style=text-align:justify><p>bar</div>" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandState("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div align=justify><p>foo</div> <p>[bar\]</p> <div align=justify><p>baz</div>" queryCommandValue("justifyfull") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify><p>foo</div> <p>[bar\]</p> <div style=text-align:justify><p>baz</div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p align=justify>foo<p>[bar\]<p align=justify>baz<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<p>[foo\]<p align=justify>bar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyfull",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>[foo</div>bar\]<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandState("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=justify>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyfull",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyfull") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/justifyright.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/justifyright.html.ini
index 0ee52fd..752fcb63 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/justifyright.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/justifyright.html.ini
@@ -1,430 +1,393 @@
+[justifyright.html?1-1000]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+
 [justifyright.html?1001-2000]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
     expected: FAIL
 
@@ -434,10 +397,334 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo<p>bar\]</center><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
@@ -446,213 +733,159 @@
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
     expected: FAIL
 
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
 
 [justifyright.html?2001-3000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody align=right><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody align=right><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
   [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["justifyright",""\]\] "<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+  [[["justifyright",""\]\] "<table><tbody align=right><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+  [[["justifyright",""\]\] "<table><tbody align=right><tr><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+  [[["justifyright",""\]\] "<table><tbody><tr align=right><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
@@ -661,49 +894,73 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -715,205 +972,10 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right><td>foo<td>b[a\]r<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -925,25 +987,136 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("defaultparagraphseparator") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
@@ -955,934 +1128,528 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-
-[justifyright.html?4001-last]
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandState("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandState("stylewithcss") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandIndeterm("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandIndeterm("justifyright") before]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandState("justifyright") before]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandState("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-
-[justifyright.html?1-1000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo</span>{}<span>bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span>foo[</span><span>\]bar</span><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "foo[bar<b>baz\]qoz</b>quz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[\]bar<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>foo[bar\]baz<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<h1>foo[bar\]baz</h1><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<pre>foo[bar\]baz</pre><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<xmp>foo[bar\]baz</xmp><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<center><p>[foo\]<p>bar</center><p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=center><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
 
 [justifyright.html?3001-4000]
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") after]
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifyright") after]
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
@@ -1891,479 +1658,748 @@
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:center><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:justify><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:left><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>[foo<p>bar\]</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div align=right>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right>foo</div>[bar\]<div align=right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div align=right><p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div><p>[bar\]<div align=right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "[foo\]<div style=text-align:right>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["justifyright",""\]\] "<p>[foo\]<div style=text-align:right><p>bar</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("defaultparagraphseparator") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:center><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:justify><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:left><p>[foo\]<p>bar</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div><p>[bar\]<div style=text-align:right><p>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>foo</div>[bar\]<div style=text-align:right>baz</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=justify><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=left><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right><p>[foo<p>bar}</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+
+[justifyright.html?4001-last]
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","div"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]</p> <div align=right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>[foo\]</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["defaultparagraphseparator","p"\],["justifyright",""\]\] "<span style=text-align:right>f[o\]o</span><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div align=right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:inherit><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<div style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div align=right><p>bar</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["justifyright",""\]\] "<p>[foo\]</p> <div style=text-align:right><p>bar</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandState("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","div"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right><p>foo</div> <p>[bar\]</p> <div style=text-align:right><p>baz</div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p align=right>foo<p>[bar\]<p align=right>baz<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<p>[foo\]<p align=right>bar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["defaultparagraphseparator","p"\],["justifyright",""\]\] "<quasit align=center><p>[foo\]</p></quasit><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=nonsense><p>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>[foo</div>bar\]<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandIndeterm("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandState("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div align=right>fo[o</div>b\]ar<p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:end>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["justifyright",""\]\] "<div dir=rtl style=text-align:start>[foo\]</div><p>extra" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false align=right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifycenter") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyfull") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyleft") before]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") after]
+    expected: FAIL
+
+  [[\] "<div contenteditable=false style=text-align:right><p contenteditable>f[\]oo</p></div>" queryCommandValue("justifyright") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/strikethrough.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/strikethrough.html.ini
index fa36477..b086eff 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/strikethrough.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/strikethrough.html.ini
@@ -1,733 +1,110 @@
-[strikethrough.html?1001-2000]
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandState("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "fo[o<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "fo[o<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandState("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-
 [strikethrough.html?1-1000]
-  [[["strikethrough",""\]\] "foo[\]bar" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "foo[\]bar" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") after]
+  [[["strikethrough",""\]\] "<b>foo[\]bar</b>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
   [[["strikethrough",""\]\] "<b>foo[\]bar</b>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["strikethrough",""\]\] "<b>foo[\]bar</b>" queryCommandValue("strikethrough") after]
+  [[["strikethrough",""\]\] "<i>foo[\]bar</i>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
   [[["strikethrough",""\]\] "<i>foo[\]bar</i>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["strikethrough",""\]\] "<i>foo[\]bar</i>" queryCommandValue("strikethrough") after]
+  [[["strikethrough",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
   [[["strikethrough",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["strikethrough",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("strikethrough") after]
+  [[["strikethrough",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
   [[["strikethrough",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["strikethrough",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("strikethrough") after]
+  [[["strikethrough",""\]\] "foo[\]bar" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" compare innerHTML]
+  [[["strikethrough",""\]\] "foo[\]bar" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("strikethrough") after]
@@ -736,19 +113,112 @@
   [[["stylewithcss","false"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("strikethrough") after]
@@ -757,304 +227,858 @@
   [[["stylewithcss","false"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("strikethrough") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" compare innerHTML]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") before]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" compare innerHTML]
     expected: FAIL
 
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
   [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[bar\]baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+
+[strikethrough.html?1001-2000]
+  [[["strikethrough",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<s>b\]ar</s>baz" queryCommandIndeterm("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandIndeterm("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandState("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandState("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<s>ba[r</s>b\]az" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandState("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandIndeterm("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandIndeterm("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "fo[o<s>bar</s>b\]az" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>ba[r</s>\]baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>b\]ar</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo[<s>bar</s>\]baz" queryCommandValue("strikethrough") before]
     expected: FAIL
 
 
 [strikethrough.html?2001-last]
+  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" queryCommandIndeterm("strikethrough") before]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandIndeterm("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandIndeterm("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") before]
+    expected: FAIL
+
   [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandState("strikethrough") after]
     expected: FAIL
 
   [[["stylewithcss","true"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["strikethrough",""\]\] "fo[o<span style=text-decoration:line-through>b\]ar</span>baz" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<strike>fo[o</strike><s>b\]ar</s>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["strikethrough",""\]\] "<s>fo[o</s><del>b\]ar</del>" queryCommandValue("strikethrough") after]
+  [[["stylewithcss","true"\],["strikethrough",""\]\] "foo{<s>bar</s>}baz" queryCommandValue("strikethrough") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/subscript.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/subscript.html.ini
index c1bd8f1..6855388 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/subscript.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/subscript.html.ini
@@ -1,686 +1,29 @@
 [subscript.html]
-  [[["subscript",""\]\] "foo[\]bar" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo[\]bar" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") after]
     expected: FAIL
 
   [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") after]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") before]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") after]
     expected: FAIL
 
-  [[["subscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("subscript") before]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") before]
     expected: FAIL
 
-  [[["subscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") after]
     expected: FAIL
 
-  [[["subscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "fo[o<sub>b\]ar</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "fo[o<sub>b\]ar</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "fo[o<sub>bar</sub>b\]az" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "fo[o<sub>bar</sub>b\]az" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo[<sub>b\]ar</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo[<sub>b\]ar</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>ba[r</sub>\]baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "foo<sub>ba[r</sub>\]baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandValue("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandIndeterm("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" compare innerHTML]
@@ -689,44 +32,752 @@
   [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandIndeterm("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") after]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") before]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") before]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandIndeterm("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") before]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandState("subscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" compare innerHTML]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") before]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("subscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") after]
     expected: FAIL
 
   [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") after]
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:sub>b\]ar</span>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<sub>fo[o</sub><span style=vertical-align:top>b\]ar</span>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<span style=vertical-align:top>[bar\]</span>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[<sub>bar</sub>\]baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo[bar\]baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "foo{<sub>bar</sub>}baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["subscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" compare innerHTML]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "<sub>fo[o</sub><sup>b\]ar</sup>" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>b\]ar</sub>baz" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>b\]ar</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>b\]ar</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>bar</sub>b\]az" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>bar</sub>b\]az" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "fo[o<sub>bar</sub>b\]az" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>\]baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>\]baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" compare innerHTML]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandIndeterm("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandState("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandState("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo<sub>ba[r</sub>b\]az" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo[<sub>b\]ar</sub>baz" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo[<sub>b\]ar</sub>baz" queryCommandValue("subscript") before]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo[\]bar" queryCommandValue("subscript") after]
+    expected: FAIL
+
+  [[["subscript",""\]\] "foo[\]bar" queryCommandValue("subscript") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/superscript.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/superscript.html.ini
index c7d8ae44..f98bcaa 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/superscript.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/superscript.html.ini
@@ -1,686 +1,47 @@
 [superscript.html]
-  [[["superscript",""\]\] "foo[\]bar" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo[\]bar" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") after]
     expected: FAIL
 
   [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") after]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["superscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["superscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["superscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["superscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" compare innerHTML]
     expected: FAIL
 
-  [[["superscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandIndeterm("superscript") before]
     expected: FAIL
 
-  [[["superscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandState("superscript") after]
     expected: FAIL
 
-  [[["superscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandState("superscript") before]
     expected: FAIL
 
-  [[["superscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "fo[o<sup>b\]ar</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "fo[o<sup>b\]ar</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "fo[o<sup>bar</sup>b\]az" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "fo[o<sup>bar</sup>b\]az" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo[<sup>b\]ar</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo[<sup>b\]ar</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>ba[r</sup>\]baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "foo<sup>ba[r</sup>\]baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandValue("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandIndeterm("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" compare innerHTML]
@@ -689,56 +50,746 @@
   [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandIndeterm("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") after]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") before]
+    expected: FAIL
+
   [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" compare innerHTML]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" compare innerHTML]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") before]
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") after]
     expected: FAIL
 
   [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") after]
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:bottom>b\]ar</span>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<sup>fo[o</sup><span style=vertical-align:super>b\]ar</span>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:bottom>[bar\]</span>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:sub>[bar\]</span>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<span style=vertical-align:super>[bar\]</span>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>[bar\]</sub></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sub>b[a\]r</sub></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>[bar\]</sup></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub><sup>b[a\]r</sup></sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>[bar\]</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sub>[a\]</sub>r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b<sup>[a\]</sup>r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sub>b[a\]r</sub>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>[bar\]</sub></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sub>b[a\]r</sub></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup><sup>[bar\]</sup></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>[bar\]<br></sup>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b<sub>[a\]</sub>r</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo<sup>b[a\]r</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[<sup>bar</sup>\]baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo[bar\]baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "foo{<sup>bar</sup>}baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["superscript",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<b>foo[\]bar</b>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<i>foo[\]bar</i>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" compare innerHTML]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "<sup>fo[o</sup><sub>b\]ar</sub>" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>b\]ar</sup>baz" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>b\]ar</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>b\]ar</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>bar</sup>b\]az" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>bar</sup>b\]az" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "fo[o<sup>bar</sup>b\]az" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup><sup>b[a\]r</sup></sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>b<sup>[a\]</sup>r</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>\]baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>\]baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" compare innerHTML]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandIndeterm("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandState("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandState("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo<sup>ba[r</sup>b\]az" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo[<sup>b\]ar</sup>baz" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo[<sup>b\]ar</sup>baz" queryCommandValue("superscript") before]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo[\]bar" queryCommandValue("superscript") after]
+    expected: FAIL
+
+  [[["superscript",""\]\] "foo[\]bar" queryCommandValue("superscript") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/underline.html.ini b/third_party/blink/web_tests/external/wpt/editing/run/underline.html.ini
index cd921e6..b0acb20 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/underline.html.ini
+++ b/third_party/blink/web_tests/external/wpt/editing/run/underline.html.ini
@@ -1,298 +1,77 @@
-[underline.html?2001-last]
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandState("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-
 [underline.html?1-1000]
-  [[["underline",""\]\] "foo[\]bar" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["underline",""\]\] "foo[\]bar" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
   [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["underline",""\]\] "<b>foo[\]bar</b>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["underline",""\]\] "<b>foo[\]bar</b>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["underline",""\]\] "<i>foo[\]bar</i>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["underline",""\]\] "<i>foo[\]bar</i>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["underline",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["underline",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["underline",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["underline",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" compare innerHTML]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("underline") after]
@@ -301,19 +80,115 @@
   [[["stylewithcss","false"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+  [[["stylewithcss","false"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("underline") after]
@@ -322,258 +197,453 @@
   [[["stylewithcss","false"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") after]
+  [[["stylewithcss","false"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" compare innerHTML]
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: line-through\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: underline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandState("stylewithcss") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p> <p>bar\]</p>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo</p><p> <span>bar</span> </p><p>baz\]</p>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p>[foo<p><br><p>bar\]" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<i>ar\]ba</i>z</s>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</s>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</s>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<s>foo[bar\]baz</s>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<span>[foo</span> <span>bar\]</span>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<table><tbody><tr><td>foo<td>b[a\]r<td>baz</table>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<i>ar\]ba</i>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>foo[bar\]baz</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s>[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<b>baz\]qoz</b>quz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar<i>baz\]qoz</i>quz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[bar\]baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<p><p> <p>foo</p>}" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "{<table><tr><td>foo<td>bar<td>baz</table>}" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<b>foo[\]bar</b>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<b>foo[\]bar</b>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<i>foo[\]bar</i>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<i>foo[\]bar</i>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<span>foo</span>{}<span>bar</span>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<span>foo[</span><span>\]bar</span>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo[\]bar" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo[\]bar" queryCommandValue("underline") before]
     expected: FAIL
 
 
 [underline.html?1001-2000]
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") before]
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandIndeterm("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandState("underline") after]
@@ -582,521 +652,487 @@
   [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") after]
     expected: FAIL
 
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<strike>[bar\]</strike>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
+    expected: FAIL
+
   [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" compare innerHTML]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandState("stylewithcss") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<strike>foo[b<i>ar\]ba</i>z</strike>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[bar\]baz</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<del>foo[b<i>ar\]ba</i>z</del>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "<p style=\\"text-decoration: overline\\">foo[bar\]baz</p>" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" compare innerHTML]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "fo[o<u>b\]ar</u>baz" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "fo[o<u>b\]ar</u>baz" queryCommandValue("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" compare innerHTML]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandValue("underline") before]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandState("underline") after]
-    expected: FAIL
-
-  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "<strike>foo[bar\]baz</strike>" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandIndeterm("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "fo[o<u>bar</u>b\]az" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" compare innerHTML]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<del>[bar\]</del>baz" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: overline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">[bar\]</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<s style=\\"text-decoration: underline\\">b[a\]r</s>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span class=\\"line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">[bar\]</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: line-through\\">b[a\]r</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">[bar\]</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u style=\\"text-decoration: overline\\">b[a\]r</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") before]
-    expected: FAIL
-
   [[["stylewithcss","true"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>ba[r</u>\]baz" queryCommandValue("underline") after]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" compare innerHTML]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>b\]ar</u>baz" queryCommandValue("underline") before]
     expected: FAIL
 
   [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") before]
+  [[["stylewithcss","true"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") before]
     expected: FAIL
 
-  [[["stylewithcss","false"\],["underline",""\]\] "foo[<u>bar</u>\]baz" queryCommandValue("underline") after]
+  [[["underline",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("underline") after]
     expected: FAIL
 
-  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") before]
+  [[["underline",""\]\] "<ins>foo[b<i>ar\]ba</i>z</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\" id=foo>ar\]ba</span>z</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"color:blue\\">ar\]ba</span>z</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[b<span style=\\"font-size:3em\\">ar\]ba</span>z</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "<ins>foo[bar\]baz</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<u>b\]ar</u>baz" queryCommandIndeterm("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<u>b\]ar</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<u>b\]ar</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<ins>[bar\]</ins>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline-and-line-through\\">b[a\]r</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span class=\\"underline\\">b[a\]r</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<span style=\\"text-decoration: underline line-through\\">[bar\]</span>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" compare innerHTML]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandIndeterm("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandState("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "foo<u>ba[r</u>b\]az" queryCommandValue("underline") before]
+    expected: FAIL
+
+
+[underline.html?2001-last]
+  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandIndeterm("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandIndeterm("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","false"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandIndeterm("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<ins>fo[o</ins><u>b\]ar</u>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" compare innerHTML]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandIndeterm("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "<u>fo[o</u><ins>b\]ar</ins>" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandState("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo<u>[bar\]</u>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["stylewithcss","true"\],["underline",""\]\] "foo{<u>bar</u>}baz" queryCommandValue("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" compare innerHTML]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" queryCommandIndeterm("underline") before]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" queryCommandValue("underline") after]
+    expected: FAIL
+
+  [[["underline",""\]\] "fo[o<span style=text-decoration:underline>b\]ar</span>baz" queryCommandValue("underline") before]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.window.js.ini
index 5ce6980..d1f9175 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.window.js.ini
@@ -1,7 +1,16 @@
 [shared-worker-fetch.window.html]
+  [private https to local: failure.]
+    expected: FAIL
+
   [private to local: failure.]
     expected: FAIL
 
+  [public https to local: failure.]
+    expected: FAIL
+
+  [public https to private: failure.]
+    expected: FAIL
+
   [public to local: failure.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation.html
index d476d090..8b2a33e8 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation.html
@@ -34,7 +34,7 @@
     document.body.append(canvas);
 
     const ctx = canvas.getContext("2d");
-    loadImage("resources/squares.jpg")
+    loadImage("resources/squares_6.jpg")
         .then((image) => createImageBitmap(image))
         .then(t.step_func_done(function(imageBitmap) {
             ctx.drawImage(imageBitmap, 0, 0);
@@ -59,7 +59,7 @@
     document.body.append(canvas);
 
     const ctx = canvas.getContext("2d");
-    loadImage("resources/squares.jpg")
+    loadImage("resources/squares_6.jpg")
         .then((image) => createImageBitmap(image, { imageOrientation: "flipY" }))
         .then(t.step_func_done(function(imageBitmap) {
             ctx.drawImage(imageBitmap, 0, 0);
@@ -84,7 +84,7 @@
     document.body.append(canvas);
 
     const ctx = canvas.getContext("2d");
-    loadImage("resources/squares.jpg")
+    loadImage("resources/squares_6.jpg")
         .then(image => createImageBitmap(image, 80, 0, 160, 160))
         .then(t.step_func_done(function(imageBitmap) {
             ctx.drawImage(imageBitmap, 0, 0);
@@ -105,7 +105,7 @@
     document.body.append(canvas);
 
     const ctx = canvas.getContext("2d");
-    loadImage("resources/squares.jpg")
+    loadImage("resources/squares_6.jpg")
         .then(image => createImageBitmap(image, 80, 0, 160, 160, { imageOrientation: "flipY" }))
         .then(t.step_func_done(function(imageBitmap) {
             ctx.drawImage(imageBitmap, 0, 0);
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html
new file mode 100644
index 0000000..807925b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<title>Test that createImageBitmap honors EXIF orientation</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>canvas { outline: 1px solid black; margin-right: 1em; }</style>
+<body>
+<script>
+function loadImage(src) {
+    return new Promise(function(resolve) {
+        const image = new Image();
+        image.addEventListener("load", () => resolve(image), { once: true });
+        image.src = src;
+    });
+}
+
+function checkColors(ctx, w, h, is_verticle, expectedColors) {
+    let data = ctx.getImageData(0, 0, w, h).data;
+    row_width = 80;
+    col_width = 80;
+
+    for (let [row, col, r, g, b, a] of expectedColors) {
+        let x = col * row_width + 10;
+        let y = row * col_width + 10;
+        let i = (x + y * w) * 4;
+
+        let expected = [r, g, b, a];
+        let actual = [data[i], data[i + 1], data[i + 2], data[i + 3]];
+
+        assert_array_approx_equals(actual, expected, 1, `Pixel value at (${x},${y}) ${expected} =~ ${actual}.`);
+    }
+}
+
+for (let orientation of [1, 2, 3, 4, 5, 6, 7, 8]) {
+    async_test(function(t) {
+        const canvas = document.createElement("canvas");
+        canvas.width = 160;
+        canvas.height = 320;
+        document.body.append(canvas);
+
+        const ctx = canvas.getContext("2d");
+        loadImage(`resources/squares_${orientation}.jpg`)
+            .then((image) => createImageBitmap(image, { imageOrientation: "none" }))
+            .then(t.step_func_done(function(imageBitmap) {
+                ctx.drawImage(imageBitmap, 0, 0, 160, 320);
+
+                checkColors(ctx, canvas.width, canvas.height, false, [
+                    // row, col, r, g, b, a
+                    [0, 0, 0, 0, 0, 255],
+                    [0, 1, 128, 128, 128, 255],
+                    [1, 0, 0, 0, 255, 255],
+                    [1, 1, 128, 128, 255, 255],
+                    [2, 0, 0, 255, 0, 255],
+                    [2, 1, 128, 255, 128, 255],
+                    [3, 0, 255, 0, 0, 255],
+                    [3, 1, 255, 128, 128, 255],
+                ]);
+            }));
+    }, `createImageBitmap with Orientation ${orientation}`);
+}
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/imagebitmap-replication-exif-orientation.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/imagebitmap-replication-exif-orientation.html
index b04a761..ab4331ad 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/imagebitmap-replication-exif-orientation.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/imagebitmap-replication-exif-orientation.html
@@ -52,7 +52,7 @@
 }
 
 promise_test(async t => {
-    const response = await fetch("resources/squares.jpg");
+    const response = await fetch("resources/squares_6.jpg");
     const blob = await response.blob();
     const image = await createImageBitmap(blob)
     const image_copy = structuredClone(image);
@@ -61,7 +61,7 @@
 
 promise_test(async t => {
     const image = new Image();
-    image.src = "resources/squares.jpg"
+    image.src = "resources/squares_6.jpg"
     await new Promise(resolve => image.onload = resolve);
     const image_copy = await createImageBitmap(image);
     checkImageBitmapRotated(image_copy);
@@ -69,7 +69,7 @@
 
 promise_test(async t => {
     const image = new Image();
-    image.src = "resources/squares.jpg"
+    image.src = "resources/squares_6.jpg"
     // The following has no effect because the image's style is not
     // processed unless the element is connected to the DOM.
     image.style.imageOrientation = "none";
@@ -81,7 +81,7 @@
 promise_test(async t => {
     const image = new Image();
     document.body.appendChild(image);
-    image.src = "resources/squares.jpg"
+    image.src = "resources/squares_6.jpg"
     // The style is being processed in this case, but the imageOrientation
     // CSS property must still have no effect because createImageBitmap
     // accesses the element's underlying media directly, without being
@@ -94,7 +94,7 @@
 
 
 promise_test(async t => {
-    const response = await fetch("resources/squares.jpg");
+    const response = await fetch("resources/squares_6.jpg");
     const blob = await response.blob();
     const image = await createImageBitmap(blob);
     const image_copy = await createImageBitmap(image);
@@ -103,7 +103,7 @@
 
 promise_test(async t => {
     const worker = new Worker("serialize-worker.js");
-    const response = await fetch("resources/squares.jpg");
+    const response = await fetch("resources/squares_6.jpg");
     const blob = await response.blob()
     const image = await createImageBitmap(blob);
     worker.postMessage({bitmap: image});
@@ -113,7 +113,7 @@
 
 promise_test(async t => {
     const worker = new Worker("transfer-worker.js");
-    let response = await fetch("resources/squares.jpg");
+    let response = await fetch("resources/squares_6.jpg");
     let blob = await response.blob();
     let image = await createImageBitmap(blob);
     worker.postMessage({bitmap: image}, [image]);
@@ -130,7 +130,7 @@
     // duplication code path (if applicable) carries over the image
     // orientation metadata.
     const worker = new Worker("transfer-worker.js");
-    let response = await fetch("resources/squares.jpg");
+    let response = await fetch("resources/squares_6.jpg");
     let blob = await response.blob();
     let image = await createImageBitmap(blob);
     const canvas = document.createElement('canvas');
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_1.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_1.jpg
new file mode 100644
index 0000000..0f0e886
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_1.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_2.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_2.jpg
new file mode 100644
index 0000000..526f7a6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_2.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_3.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_3.jpg
new file mode 100644
index 0000000..a21e521
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_3.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_4.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_4.jpg
new file mode 100644
index 0000000..c4380b1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_4.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_5.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_5.jpg
new file mode 100644
index 0000000..0bdd89aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_5.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_6.jpg
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares.jpg
rename to third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_6.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_7.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_7.jpg
new file mode 100644
index 0000000..9b1a3468
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_7.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_8.jpg b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_8.jpg
new file mode 100644
index 0000000..41d2fbe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/imagebitmap/resources/squares_8.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/embedded-content-rendering-rules/audio-without-controls.html.ini b/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/embedded-content-rendering-rules/audio-without-controls.html.ini
new file mode 100644
index 0000000..664cc92b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/replaced-elements/embedded-content-rendering-rules/audio-without-controls.html.ini
@@ -0,0 +1,2 @@
+[audio-without-controls.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html.ini
index f65accc3..6b415c1 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html.ini
@@ -1,3 +1,5 @@
 [autoplay-hidden.optional.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): TIMEOUT
   [Allow delaying autoplay until video elements become visible]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini
index f16f5f5..a58f1cea 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/select-event.html.ini
@@ -4,21 +4,15 @@
 
   [input type password: select() event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
-      if product == "chrome": PASS
+      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): PASS
       FAIL
 
   [input type password: select() twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type password: selectionDirection a second time (must not fire select)]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [input type password: selectionDirection disconnected node]
     expected: FAIL
@@ -41,11 +35,17 @@
       if product == "chrome": FAIL
 
   [input type password: selectionEnd out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type password: selectionEnd out of range disconnected node]
     expected: FAIL
 
+  [input type password: selectionEnd out of range event queue]
+    expected:
+      if product == "chrome": FAIL
+
   [input type password: selectionEnd out of range twice in disconnected node (must fire select only once)]
     expected: FAIL
 
@@ -84,11 +84,17 @@
   [input type password: setRangeText() disconnected node]
     expected: FAIL
 
+  [input type password: setRangeText() event queue]
+    expected:
+      if product == "chrome": FAIL
+
   [input type password: setRangeText() twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type password: setSelectionRange out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type password: setSelectionRange out of range disconnected node]
     expected: FAIL
@@ -101,30 +107,40 @@
     expected: FAIL
 
   [input type password: setSelectionRange() a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type password: setSelectionRange() disconnected node]
     expected: FAIL
 
   [input type password: setSelectionRange() event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type password: setSelectionRange() twice in disconnected node (must fire select only once)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type search: select() disconnected node]
     expected: FAIL
 
   [input type search: select() event queue]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type search: select() twice in disconnected node (must fire select only once)]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type search: selectionDirection a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type search: selectionDirection disconnected node]
     expected: FAIL
@@ -137,7 +153,9 @@
     expected: FAIL
 
   [input type search: selectionEnd a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type search: selectionEnd disconnected node]
     expected: FAIL
@@ -147,14 +165,16 @@
       if product == "chrome": FAIL
 
   [input type search: selectionEnd out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type search: selectionEnd out of range disconnected node]
     expected: FAIL
 
   [input type search: selectionEnd out of range event queue]
     expected:
-      if product == "chrome": FAIL
+      if product == "chrome": [FAIL, PASS]
 
   [input type search: selectionEnd out of range twice in disconnected node (must fire select only once)]
     expected: FAIL
@@ -164,7 +184,7 @@
 
   [input type search: selectionStart a second time (must not fire select)]
     expected:
-      if product == "chrome": PASS
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [input type search: selectionStart disconnected node]
@@ -176,7 +196,7 @@
 
   [input type search: selectionStart out of range a second time (must not fire select)]
     expected:
-      if product == "chrome": PASS
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [input type search: selectionStart out of range disconnected node]
@@ -194,7 +214,7 @@
 
   [input type search: setRangeText() a second time (must not fire select)]
     expected:
-      if product == "chrome": PASS
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [input type search: setRangeText() disconnected node]
@@ -238,40 +258,44 @@
 
   [input type tel: select() event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type tel: select() twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type tel: selectionDirection a second time (must not fire select)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type tel: selectionDirection disconnected node]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type tel: selectionDirection event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type tel: selectionDirection twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type tel: selectionEnd a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type tel: selectionEnd disconnected node]
     expected: FAIL
 
   [input type tel: selectionEnd event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type tel: selectionEnd out of range a second time (must not fire select)]
@@ -291,13 +315,17 @@
     expected: FAIL
 
   [input type tel: selectionStart a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type tel: selectionStart disconnected node]
     expected: FAIL
 
   [input type tel: selectionStart event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type tel: selectionStart out of range a second time (must not fire select)]
@@ -311,29 +339,23 @@
       if product == "chrome": FAIL
 
   [input type tel: selectionStart out of range twice in disconnected node (must fire select only once)]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [input type tel: selectionStart twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type tel: setRangeText() a second time (must not fire select)]
-    expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
-      FAIL
+    expected: FAIL
 
   [input type tel: setRangeText() disconnected node]
     expected: FAIL
 
   [input type tel: setRangeText() event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
+      if product == "chrome": FAIL
 
   [input type tel: setRangeText() twice in disconnected node (must fire select only once)]
-    expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
-      FAIL
+    expected: FAIL
 
   [input type tel: setSelectionRange out of range a second time (must not fire select)]
     expected: FAIL
@@ -350,7 +372,7 @@
 
   [input type tel: setSelectionRange() a second time (must not fire select)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [input type tel: setSelectionRange() disconnected node]
@@ -358,7 +380,6 @@
 
   [input type tel: setSelectionRange() event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type tel: setSelectionRange() twice in disconnected node (must fire select only once)]
@@ -372,22 +393,22 @@
 
   [input type text: select() twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): PASS
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "highdpi"): PASS
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
-      [PASS, FAIL]
 
   [input type text: selectionDirection a second time (must not fire select)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type text: selectionDirection disconnected node]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type text: selectionDirection event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type text: selectionDirection twice in disconnected node (must fire select only once)]
@@ -395,9 +416,7 @@
 
   [input type text: selectionEnd a second time (must not fire select)]
     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, PASS]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       FAIL
 
   [input type text: selectionEnd disconnected node]
@@ -405,18 +424,21 @@
 
   [input type text: selectionEnd event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
+      if product == "chrome": FAIL
 
   [input type text: selectionEnd out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type text: selectionEnd out of range disconnected node]
     expected: FAIL
 
   [input type text: selectionEnd out of range event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type text: selectionEnd out of range twice in disconnected node (must fire select only once)]
@@ -424,34 +446,38 @@
 
   [input type text: selectionEnd twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type text: selectionStart a second time (must not fire select)]
     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, PASS]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [input type text: selectionStart disconnected node]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type text: selectionStart event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
+      if product == "chrome": FAIL
 
   [input type text: selectionStart out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type text: selectionStart out of range disconnected node]
     expected: FAIL
 
   [input type text: selectionStart out of range event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type text: selectionStart out of range twice in disconnected node (must fire select only once)]
@@ -459,34 +485,47 @@
 
   [input type text: selectionStart twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type text: setRangeText() a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type text: setRangeText() disconnected node]
     expected: FAIL
 
+  [input type text: setRangeText() event queue]
+    expected:
+      if product == "chrome": FAIL
+      [PASS, FAIL]
+
   [input type text: setRangeText() twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type text: setSelectionRange out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type text: setSelectionRange out of range disconnected node]
     expected: FAIL
 
   [input type text: setSelectionRange out of range event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type text: setSelectionRange out of range twice in disconnected node (must fire select only once)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type text: setSelectionRange() a second time (must not fire select)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       FAIL
 
   [input type text: setSelectionRange() disconnected node]
@@ -494,56 +533,69 @@
 
   [input type text: setSelectionRange() event queue]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type text: setSelectionRange() twice in disconnected node (must fire select only once)]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type url: select() disconnected node]
     expected: FAIL
 
   [input type url: select() event queue]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type url: select() twice in disconnected node (must fire select only once)]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type url: selectionDirection a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type url: selectionDirection disconnected node]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type url: selectionDirection event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type url: selectionDirection twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type url: selectionEnd a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [input type url: selectionEnd disconnected node]
     expected: FAIL
 
   [input type url: selectionEnd event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type url: selectionEnd out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type url: selectionEnd out of range disconnected node]
     expected: FAIL
 
   [input type url: selectionEnd out of range event queue]
     expected:
-      if product == "chrome": FAIL
+      if product == "chrome": [FAIL, PASS]
 
   [input type url: selectionEnd out of range twice in disconnected node (must fire select only once)]
     expected: FAIL
@@ -553,7 +605,7 @@
 
   [input type url: selectionStart a second time (must not fire select)]
     expected:
-      if product == "chrome": PASS
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [input type url: selectionStart disconnected node]
@@ -561,19 +613,28 @@
 
   [input type url: selectionStart event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [input type url: selectionStart out of range a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type url: selectionStart out of range disconnected node]
     expected: FAIL
 
+  [input type url: selectionStart out of range event queue]
+    expected:
+      if product == "chrome": FAIL
+
   [input type url: selectionStart out of range twice in disconnected node (must fire select only once)]
     expected: FAIL
 
   [input type url: selectionStart twice in disconnected node (must fire select only once)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type url: setRangeText() a second time (must not fire select)]
     expected: FAIL
@@ -602,7 +663,9 @@
     expected: FAIL
 
   [input type url: setSelectionRange() a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if product == "chrome": [FAIL, PASS]
+      FAIL
 
   [input type url: setSelectionRange() disconnected node]
     expected: FAIL
@@ -615,26 +678,33 @@
     expected: FAIL
 
   [textarea: select() disconnected node]
-    expected: [PASS, FAIL]
+    expected:
+      if product == "chrome": [PASS, FAIL]
 
   [textarea: select() event queue]
-    expected: FAIL
+    expected:
+      if product == "chrome": [PASS, FAIL]
+      FAIL
 
   [textarea: select() twice in disconnected node (must fire select only once)]
     expected:
-      if product == "chrome": PASS
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
       FAIL
 
   [textarea: selectionDirection a second time (must not fire select)]
     expected:
-      if product == "chrome": PASS
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      if product == "chrome": [FAIL, PASS]
       FAIL
 
   [textarea: selectionDirection disconnected node]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [textarea: selectionDirection event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [textarea: selectionDirection twice in disconnected node (must fire select only once)]
@@ -648,6 +718,10 @@
   [textarea: selectionEnd disconnected node]
     expected: FAIL
 
+  [textarea: selectionEnd event queue]
+    expected:
+      if product == "chrome": FAIL
+
   [textarea: selectionEnd out of range a second time (must not fire select)]
     expected: FAIL
 
@@ -664,11 +738,16 @@
   [textarea: selectionEnd twice in disconnected node (must fire select only once)]
     expected: FAIL
 
+  [textarea: selectionStart a second time (must not fire select)]
+    expected: [PASS, FAIL]
+
   [textarea: selectionStart disconnected node]
     expected: FAIL
 
   [textarea: selectionStart event queue]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [textarea: selectionStart out of range a second time (must not fire select)]
     expected: FAIL
@@ -685,6 +764,7 @@
 
   [textarea: selectionStart twice in disconnected node (must fire select only once)]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [textarea: setRangeText() a second time (must not fire select)]
@@ -701,9 +781,7 @@
     expected: FAIL
 
   [textarea: setSelectionRange out of range a second time (must not fire select)]
-    expected:
-      if product == "chrome": PASS
-      FAIL
+    expected: FAIL
 
   [textarea: setSelectionRange out of range disconnected node]
     expected: FAIL
@@ -716,14 +794,19 @@
     expected: FAIL
 
   [textarea: setSelectionRange() a second time (must not fire select)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
 
   [textarea: setSelectionRange() disconnected node]
     expected: FAIL
 
   [textarea: setSelectionRange() event queue]
     expected:
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       if product == "chrome": FAIL
 
   [textarea: setSelectionRange() twice in disconnected node (must fire select only once)]
-    expected: FAIL
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PASS]
+      FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-idl-property.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-idl-property.html
index 37c79ef..7b497ce0 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-idl-property.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-idl-property.html
@@ -8,7 +8,7 @@
 
 <button id=b1>This is an anchor button</button>
 <div popover id=p1 anchor=b1>This is a popover</div>
-<button id=b2 popovertoggletarget=p1>This button invokes the popover but isn't an anchor</button>
+<button id=b2 popovertarget=p1>This button invokes the popover but isn't an anchor</button>
 
 <script>
   test(function() {
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-nested-display.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-nested-display.html
index 4b83d96..b60ff49e 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-nested-display.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-anchor-nested-display.html
@@ -5,11 +5,11 @@
 <link rel=help href="https://html.spec.whatwg.org/multipage/popover.html">
 <link rel=match href="popover-anchor-nested-display-ref.html">
 
-<button id=main-menu-button popovertoggletarget=main-menu>Show menu</button>
+<button id=main-menu-button popovertarget=main-menu>Show menu</button>
 
 <div id=main-menu popover anchor=main-menu-button>
   <div>Foo</div>
-  <button id=nested-menu-button popovertoggletarget=nested-menu>
+  <button id=nested-menu-button popovertarget=nested-menu>
     Show nested menu
   </button>
   <div>Bar</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus-2.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus-2.html
index 569b633..463a048 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus-2.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus-2.html
@@ -14,15 +14,15 @@
   <button id=button1>Button1</button>
   <div popover id=popover1 style="top:100px">
     <button id=inside_popover1>Inside1</button>
-    <button id=invoker2 popovertoggletarget=popover2>Nested Invoker 2</button>
+    <button id=invoker2 popovertarget=popover2>Nested Invoker 2</button>
     <button id=inside_popover2>Inside2</button>
   </div>
   <button id=button2>Button2</button>
-  <button popovertoggletarget=popover1 id=invoker1>Invoker1</button>
+  <button popovertarget=popover1 id=invoker1>Invoker1</button>
   <button id=button3>Button3</button>
   <div popover id=popover2 style="top:200px">
     <button id=inside_popover3>Inside3</button>
-    <button id=invoker3 popovertoggletarget=popover3>Nested Invoker 3</button>
+    <button id=invoker3 popovertarget=popover3>Nested Invoker 3</button>
   </div>
   <div popover id=popover3 style="top:300px">
     Non-focusable popover
@@ -90,11 +90,11 @@
 }, "Popover focus navigation");
 </script>
 
-<button id=circular0 popovertoggletarget=popover4>Invoker</button>
+<button id=circular0 popovertarget=popover4>Invoker</button>
 <div id=popover4 popover>
-  <button id=circular1 autofocus popoverhidetarget=popover4></button>
-  <button id=circular2 popovershowtarget=popover4></button>
-  <button id=circular3 popovertoggletarget=popover4></button>
+  <button id=circular1 autofocus popovertarget=popover4 popovertargetaction=hide></button>
+  <button id=circular2 popovertarget=popover4 popovertargetaction=show></button>
+  <button id=circular3 popovertarget=popover4></button>
 </div>
 <button id=circular4>after</button>
 <script>
@@ -107,16 +107,16 @@
 </script>
 
 <div id=deleted>
-  <button popovershowtarget=deleted1>Show popover</button>
+  <button popovertarget=deleted1 popovertargetaction=show>Show popover</button>
   <div popover id=deleted1>
-    <button popoverhidetarget=deleted1 autofocus>Hide popover</button>
+    <button popovertarget=deleted1 popovertargetaction=hide autofocus>Hide popover</button>
   </div>
 </div>
 <script>
 promise_test(async t => {
   const invoker = document.querySelector('#deleted>button');
   const popover = document.querySelector('#deleted>[popover]');
-  const hideButton = popover.querySelector('[popoverhidetarget]');
+  const hideButton = popover.querySelector('[popovertargetaction=hide]');
   invoker.focus(); // Make sure button is focused.
   assert_equals(document.activeElement,invoker);
   await sendEnter(); // Activate the invoker
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
index 307ca8a..a8555d7 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-focus.html
@@ -71,7 +71,7 @@
       button.remove();
     });
     popover.id = popoverId;
-    button.setAttribute('popovertoggletarget', popoverId);
+    button.setAttribute('popovertarget', popoverId);
     return button;
   }
   function addPriorFocus(t) {
@@ -187,7 +187,7 @@
       const priorFocus = addPriorFocus(t);
       assert_false(popover.matches(':open'), 'popover should start out hidden');
       let button = addInvoker(t, popover);
-      assert_equals(button.getAttribute('popovertoggletarget'), popover.id, 'This test assumes the button uses `popovertoggletarget`.');
+      assert_equals(button.getAttribute('popovertarget'), popover.id, 'This test assumes the button uses `popovertarget`.');
       assert_not_equals(button, priorFocus, 'Stranger things have happened');
       assert_false(popover.contains(button), 'Start with a non-contained button');
       priorFocus.focus();
@@ -200,8 +200,8 @@
       assert_false(isElementVisible(popover));
 
       // Same thing, but the button is contained within the popover
-      button.removeAttribute('popovertoggletarget');
-      button.setAttribute('popoverhidetarget', popover.id);
+      button.setAttribute('popovertarget', popover.id);
+      button.setAttribute('popovertargetaction', 'hide');
       popover.appendChild(button);
       t.add_cleanup(() => button.remove());
       priorFocus.focus();
@@ -216,7 +216,7 @@
       assert_equals(document.activeElement, priorFocus, 'Contained button should return focus to the previously focused element');
       assert_false(isElementVisible(popover));
 
-      // Same thing, but the button is unrelated (no popovertoggletarget)
+      // Same thing, but the button is unrelated (no popovertarget)
       button = document.createElement('button');
       document.body.appendChild(button);
       priorFocus.focus();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-invoking-attribute.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-invoking-attribute.html
index d0098d32..7b1dc20a 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-invoking-attribute.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-invoking-attribute.html
@@ -13,19 +13,15 @@
 
 <body>
 <script>
-const buttonLogic = (t,s,h) => {
-  // This mimics the expected logic for button invokers:
-  let expectedBehavior = t ? "toggle" : (s ? "show" : (h ? "hide" : "none"));
-  let expectedId = t || s || h || 1;
-  if (!t && s && h) {
-    // Special case - only use toggle if the show/hide idrefs match.
-    expectedBehavior = (s === h) ? "toggle" : "show";
+const actionReflectionLogic = (action) => {
+  switch (action?.toLowerCase()) {
+    case "show": return "show";
+    case "hide": return "hide";
+    default: return "toggle";
   }
-  return {expectedBehavior, expectedId};
 }
-const noActivationLogic = (t,s,h) => {
-  // This does not activate any popovers.
-  return {expectedBehavior: "none", expectedId: 1};
+const noActivationLogic = (action) => {
+  return "none";
 }
 function makeElementWithType(element,type) {
   return (test) => {
@@ -35,17 +31,12 @@
     return el;
   };
 }
-function setInvokingContentAttribute(invoker,attr,idref) {
-  invoker.setAttribute(attr,idref);
-  assert_equals(invoker[attr + "Element"],document.getElementById(idref));
-}
 const supportedButtonTypes = ['button','reset','submit',''].map(type => {
   return   {
     name: `<button type="${type}">`,
     makeElement: makeElementWithType('button',type),
     invokeFn: el => {el.focus(); el.click()},
-    getExpectedLogic: buttonLogic,
-    supported: true,
+    getExpectedLogic: actionReflectionLogic,
   };
 });
 const supportedInputButtonTypes = ['button','reset','submit','image'].map(type => {
@@ -53,8 +44,7 @@
     name: `<input type="${type}">`,
     makeElement: makeElementWithType('input',type),
     invokeFn: el => {el.focus(); el.click()},
-    getExpectedLogic: buttonLogic,
-    supported: true,
+    getExpectedLogic: actionReflectionLogic,
   };
 });
 const unsupportedTypes = ['text','email','password','search','tel','url','checkbox','radio','range','file','color','date','datetime-local','month','time','week','number'].map(type => {
@@ -63,7 +53,6 @@
     makeElement: makeElementWithType('input',type),
     invokeFn: (el) => {el.focus();},
     getExpectedLogic: noActivationLogic, // None of these support popover invocation
-    supported: false,
   };
 });
 const invokers = [
@@ -74,86 +63,70 @@
 window.addEventListener('load', () => {
   ["auto","manual"].forEach(type => {
     invokers.forEach(testcase => {
-      let t_set = [1], s_set = [1], h_set = [1];
-      if (testcase.supported) {
-        t_set = s_set = h_set = [0,1,2]; // Test all permutations
-      }
-      t_set.forEach(t => {
-        s_set.forEach(s => {
-          h_set.forEach(h => {
-            [false,true].forEach(use_idl => {
-              promise_test(async test => {
-                const popover1 = Object.assign(document.createElement('div'),{popover: type, id: 'popover-1'});
-                const popover2 = Object.assign(document.createElement('div'),{popover: type, id: 'popover-2'});
-                assert_equals(popover1.popover,type);
-                assert_equals(popover2.popover,type);
-                assert_not_equals(popover1.id,popover2.id);
-                const invoker = testcase.makeElement(test);
-                if (use_idl) {
-                  invoker.popoverToggleTargetElement = t===1 ? popover1 : (t===2 ? popover2 : null);
-                  invoker.popoverShowTargetElement = s===1 ? popover1 : (s===2 ? popover2 : null);
-                  invoker.popoverHideTargetElement = h===1 ? popover1 : (h===2 ? popover2 : null);
-                } else {
-                  if (t) setInvokingContentAttribute(invoker,'popoverToggleTarget',t===1 ? popover1.id : popover2.id);
-                  if (s) setInvokingContentAttribute(invoker,'popoverShowTarget',s===1 ? popover1.id : popover2.id);
-                  if (h) setInvokingContentAttribute(invoker,'popoverHideTarget',h===1 ? popover1.id : popover2.id);
-                }
-                assert_true(!document.getElementById(popover1.id));
-                assert_true(!document.getElementById(popover2.id));
-                document.body.appendChild(popover1);
-                document.body.appendChild(popover2);
-                test.add_cleanup(() => {
-                  popover1.remove();
-                  popover2.remove();
-                });
-                const {expectedBehavior, expectedId} = testcase.getExpectedLogic(t,s,h);
-                const otherId = expectedId !== 1 ? 1 : 2;
-                function assertPopoverShowing(num,state,message) {
-                  assert_true(num>0,`Invalid expectedId ${num}`);
-                  assert_equals((num===1 ? popover1 : popover2).matches(':open'),state,message || "");
-                }
-                assertPopoverShowing(expectedId,false);
-                assertPopoverShowing(otherId,false);
-                await testcase.invokeFn(invoker);
-                assert_equals(document.activeElement,invoker,'Focus should end up on the invoker');
-                assertPopoverShowing(otherId,false,'The other popover should never change');
-                switch (expectedBehavior) {
-                  case "toggle":
-                  case "show":
-                    assertPopoverShowing(expectedId,true,'Toggle or show should show the popover');
-                    (expectedId===1 ? popover1 : popover2).hidePopover(); // Hide the popover
-                    break;
-                  case "hide":
-                  case "none":
-                    assertPopoverShowing(expectedId,false,'Hide or none should leave the popover hidden');
-                    break;
-                  default:
-                    assert_unreached();
-                }
-                if (expectedBehavior === "none") {
-                  // If no behavior is expected, then there is nothing left to test. Even re-focusing
-                  // a control that has no expected behavior may hide an open popover via light dismiss.
-                  return;
-                }
-                (expectedId===1 ? popover1 : popover2).showPopover(); // Show the popover directly
-                assert_equals(document.activeElement,invoker,'The popover should not shift focus');
-                assertPopoverShowing(expectedId,true);
-                assertPopoverShowing(otherId,false);
-                await testcase.invokeFn(invoker);
-                assertPopoverShowing(otherId,false,'The other popover should never change');
-                switch (expectedBehavior) {
-                  case "toggle":
-                  case "hide":
-                    assertPopoverShowing(expectedId,false,'Toggle or hide should hide the popover');
-                    break;
-                  case "show":
-                    assertPopoverShowing(expectedId,true,'Show should leave the popover showing');
-                    break;
-                  default:
-                    assert_unreached();
-                }
-              },`Test ${testcase.name}, t=${t}, s=${s}, h=${h}, ${use_idl ? "IDL" : "Content Attr"}, with popover=${type}`);
-            });
+      ["toggle","hide","show","ShOw","garbage",null,undefined].forEach(action => {
+        [false,true].forEach(use_idl_for_target => {
+          [false,true].forEach(use_idl_for_action => {
+            promise_test(async test => {
+              const popover = Object.assign(document.createElement('div'),{popover: type, id: 'my-popover'});
+              assert_equals(popover.popover,type,'reflection');
+              const invoker = testcase.makeElement(test);
+              if (use_idl_for_target) {
+                invoker.popoverTargetElement = popover;
+                assert_equals(invoker.getAttribute('popovertarget'),'','attribute value');
+              } else {
+                invoker.setAttribute('popovertarget',popover.id);
+              }
+              if (use_idl_for_action) {
+                invoker.popoverTargetAction = action;
+                assert_equals(invoker.getAttribute('popovertargetaction'),String(action),'action reflection');
+              } else {
+                invoker.setAttribute('popovertargetaction',action);
+              }
+              assert_true(!document.getElementById(popover.id));
+              assert_equals(invoker.popoverTargetElement,null,'targetElement should be null before the popover is in the document');
+              assert_equals(invoker.popoverTargetAction,actionReflectionLogic(action),'action should be correct immediately');
+              document.body.appendChild(popover);
+              test.add_cleanup(() => {popover.remove();});
+              assert_equals(invoker.popoverTargetElement,popover,'target element should be returned once it\'s in the document');
+              assert_false(popover.matches(':open'));
+              await testcase.invokeFn(invoker);
+              assert_equals(document.activeElement,invoker,'Focus should end up on the invoker');
+              expectedBehavior = testcase.getExpectedLogic(action);
+              switch (expectedBehavior) {
+                case "toggle":
+                case "show":
+                  assert_true(popover.matches(':open'),'Toggle or show should show the popover');
+                  popover.hidePopover(); // Hide the popover
+                  break;
+                case "hide":
+                case "none":
+                  assert_false(popover.matches(':open'),'Hide or none should leave the popover hidden');
+                  break;
+                default:
+                  assert_unreached();
+              }
+              if (expectedBehavior === "none") {
+                // If no behavior is expected, then there is nothing left to test. Even re-focusing
+                // a control that has no expected behavior may hide an open popover via light dismiss.
+                return;
+              }
+              assert_false(popover.matches(':open'));
+              popover.showPopover(); // Show the popover directly
+              assert_equals(document.activeElement,invoker,'The popover should not shift focus');
+              assert_true(popover.matches(':open'));
+              await testcase.invokeFn(invoker);
+              switch (expectedBehavior) {
+                case "toggle":
+                case "hide":
+                  assert_false(popover.matches(':open'),'Toggle or hide should hide the popover');
+                  break;
+                case "show":
+                  assert_true(popover.matches(':open'),'Show should leave the popover showing');
+                  break;
+                default:
+                  assert_unreached();
+              }
+            },`Test ${testcase.name}, action=${action}, ${use_idl_for_target ? "popoverTarget IDL" : "popovertarget attr"}, ${use_idl_for_action ? "popoverTargetAction IDL" : "popovertargetaction attr"}, with popover=${type}`);
           });
         });
       });
@@ -164,7 +137,7 @@
 
 
 
-<button popovertoggletarget=p1>Toggle Popover 1</button>
+<button popovertarget=p1>Toggle Popover 1</button>
 <div popover id=p1 style="border: 5px solid red;top: 100px;left: 100px;">This is popover #1</div>
 
 <script>
@@ -206,7 +179,7 @@
     await assertState(true,2,1);
     popover.hidePopover();
     await assertState(false,2,2);
-  }, "Clicking a popovertoggletarget button opens a closed popover (also check event counts)");
+  }, "Clicking a popovertarget button opens a closed popover (also check event counts)");
 
   promise_test(async () => {
     showCount = hideCount = 0;
@@ -215,6 +188,6 @@
     await assertState(true,1,0);
     await clickOn(button);
     await assertState(false,1,1);
-  }, "Clicking a popovertoggletarget button closes an open popover (also check event counts)");
+  }, "Clicking a popovertarget button closes an open popover (also check event counts)");
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
index 587418b..2e9fdb4 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-light-dismiss.html
@@ -11,13 +11,13 @@
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="resources/popover-utils.js"></script>
 
-<button id=b1t popovertoggletarget='p1'>Popover 1</button>
-<button id=b1s popovershowtarget='p1'>Popover 1</button>
+<button id=b1t popovertarget='p1'>Popover 1</button>
+<button id=b1s popovertarget='p1' popovertargetaction=show>Popover 1</button>
 <button id=p1anchor>Popover1 anchor (no action)</button>
 <span id=outside>Outside all popovers</span>
 <div popover id=p1 anchor=p1anchor>
   <span id=inside1>Inside popover 1</span>
-  <button id=b2 popovershowtarget='p2'>Popover 2</button>
+  <button id=b2 popovertarget='p2' popovertargetaction=show>Popover 2</button>
   <span id=inside1after>Inside popover 1 after button</span>
 </div>
 <div popover id=p2 anchor=b2>
@@ -234,9 +234,9 @@
     await waitForRender();
     p1HideCount = popover1HideCount;
     await clickOn(button1toggle);
-    assert_false(popover1.matches(':open'),'popover1 should be hidden by popovertoggletarget');
-    assert_equals(popover1HideCount,p1HideCount+1,'popover1 should get hidden only once by popovertoggletarget');
-  },'Clicking on popovertoggletarget element, even if it wasn\'t used for activation, should hide it exactly once');
+    assert_false(popover1.matches(':open'),'popover1 should be hidden by popovertarget');
+    assert_equals(popover1HideCount,p1HideCount+1,'popover1 should get hidden only once by popovertarget');
+  },'Clicking on popovertarget element, even if it wasn\'t used for activation, should hide it exactly once');
 
   promise_test(async () => {
     popover1.showPopover();
@@ -265,12 +265,12 @@
   },'Dragging from an open popover outside an open popover should leave the popover open');
 </script>
 
-<button id=b3 popovertoggletarget=p3>Popover 3 - button 3
+<button id=b3 popovertarget=p3>Popover 3 - button 3
   <div popover id=p4>Inside popover 4</div>
 </button>
 <div popover id=p3>Inside popover 3</div>
 <div popover id=p5>Inside popover 5
-  <button popovertoggletarget=p3>Popover 3 - button 4 - unused</button>
+  <button popovertarget=p3>Popover 3 - button 4 - unused</button>
 </div>
 <style>
   #p3 {top:100px;}
@@ -309,7 +309,7 @@
   <div style="height:2000px;background:lightgreen"></div>
   Bottom of popover6
 </div>
-<button popovertoggletarget=p6>Popover 6</button>
+<button popovertarget=p6>Popover 6</button>
 <style>
   #p6 {
     width: 300px;
@@ -388,16 +388,16 @@
 <!-- Convoluted ancestor relationship -->
 <div popover id=convoluted_p1>Popover 1
   <div id=convoluted_anchor>Anchor
-    <button popovertoggletarget=convoluted_p2>Open Popover 2</button>
+    <button popovertarget=convoluted_p2>Open Popover 2</button>
     <div popover id=convoluted_p4><p>Popover 4</p></div>
   </div>
 </div>
 <div popover id=convoluted_p2 anchor=convoluted_p2>Popover 2 (self-anchor-linked)
-  <button popovertoggletarget=convoluted_p3>Open Popover 3</button>
-  <button popovershowtarget=convoluted_p2>Self-linked invoker</button>
+  <button popovertarget=convoluted_p3>Open Popover 3</button>
+  <button popovertarget=convoluted_p2 popovertargetaction=show>Self-linked invoker</button>
 </div>
 <div popover id=convoluted_p3 anchor=convoluted_anchor>Popover 3
-  <button popovertoggletarget=convoluted_p4>Open Popover 4</button>
+  <button popovertarget=convoluted_p4>Open Popover 4</button>
 </div>
 <button onclick="convoluted_p1.showPopover()">Open convoluted popover</button>
 <style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-stacking.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-stacking.html
index bdd6feb..a183335 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-stacking.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-stacking.html
@@ -27,19 +27,19 @@
 </div>
 
 <div class="example">
-  <p>popovertoggletarget attribute relationship</p>
+  <p>popovertarget attribute relationship</p>
   <div popover class=ancestor><p>Ancestor popover</p>
-    <button popovertoggletarget=trigger1 class=clickme>Button</button>
+    <button popovertarget=trigger1 class=clickme>Button</button>
   </div>
   <div id=trigger1 popover class=child><p>Child popover</p></div>
 </div>
 
 <div class="example">
-  <p>nested popovertoggletarget attribute relationship</p>
+  <p>nested popovertarget attribute relationship</p>
   <div popover class=ancestor><p>Ancestor popover</p>
     <div>
       <div>
-        <button popovertoggletarget=trigger2 class=clickme>Button</button>
+        <button popovertarget=trigger2 class=clickme>Button</button>
       </div>
     </div>
   </div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-target-element-disabled.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-target-element-disabled.html
index 3d139c5..92c28a4 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-target-element-disabled.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-target-element-disabled.html
@@ -5,7 +5,7 @@
 <script src="/resources/testharnessreport.js"></script>
 
 <div id=outerpopover popover=auto>
-  <button popovertoggletarget=innerpopover disabled>toggle popover</button>
+  <button popovertarget=innerpopover disabled>toggle popover</button>
 </div>
 <div id=innerpopover popover=auto>popover</div>
 <script>
@@ -20,7 +20,7 @@
 </script>
 
 <div id=outerpopover2 popover=auto>
-  <button id=togglebutton2 popovertoggletarget=innerpopover2>toggle popover</button>
+  <button id=togglebutton2 popovertarget=innerpopover2>toggle popover</button>
 </div>
 <div id=innerpopover2 popover=auto>popover</div>
 <script>
@@ -41,7 +41,7 @@
 </script>
 
 <div id=outerpopover3 popover=auto>
-  <button id=togglebutton3 popovertoggletarget=innerpopover3>toggle popover</button>
+  <button id=togglebutton3 popovertarget=innerpopover3>toggle popover</button>
 </div>
 <div id=innerpopover3 popover=auto>popover</div>
 <script>
@@ -62,7 +62,7 @@
 </script>
 
 <div id=outerpopover4 popover=auto>
-  <button id=togglebutton4 popovertoggletarget=innerpopover4>toggle popover</button>
+  <button id=togglebutton4 popovertarget=innerpopover4>toggle popover</button>
 </div>
 <div id=innerpopover4 popover=auto>popover</div>
 <form id=submitform>form</form>
@@ -84,7 +84,7 @@
 </script>
 
 <div id=outerpopover5 popover=auto>
-  <input type=button id=togglebutton5 popovertoggletarget=innerpopover5>toggle popover</button>
+  <input type=button id=togglebutton5 popovertarget=innerpopover5>toggle popover</button>
 </div>
 <div id=innerpopover5 popover=auto>popover</div>
 <script>
@@ -105,7 +105,7 @@
 </script>
 
 <div id=outerpopover6 popover=auto>
-  <button id=togglebutton6 popovertoggletarget=innerpopover6>toggle popover</button>
+  <button id=togglebutton6 popovertarget=innerpopover6>toggle popover</button>
 </div>
 <div id=innerpopover6 popover=auto>popover</div>
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-top-layer-combinations.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-top-layer-combinations.html
index c8e4211e..95f666e0 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-top-layer-combinations.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-top-layer-combinations.html
@@ -118,9 +118,8 @@
       const button = document.createElement('button');
       t.add_cleanup(() => button.remove());
       document.body.appendChild(button);
-      assert_equals(ex.id,'');
-      ex.id = 'popover-id';
-      button.popoverToggleTargetElement = ex;
+      button.popoverTargetElement = ex;
+      button.popoverTargetAction = "toggle";
       assert_true(ex.matches(':closed'));
       await clickOn(button);
       ensureIsOpenPopover(ex,'Invoking element should be able to invoke all popovers');
diff --git a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
index ab342f8..00fabef 100644
--- a/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
+++ b/third_party/blink/web_tests/external/wpt/intersection-observer/cross-origin-iframe.sub.html.ini
@@ -1,15 +1,19 @@
 [cross-origin-iframe.sub.html]
+  [First rAF]
+    expected: [PASS, FAIL]
+
   [iframeDocument.scrollingElement.scrollTop = 250]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
       if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
 
   [topDocument.scrollingElement.scrollTop = 100]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "mac"): FAIL
 
   [topDocument.scrollingElement.scrollTop = 200]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
       if (product == "content_shell") and (os == "win") and (port == "win11"): PASS
+      if (product == "content_shell") and (os == "mac"): [PASS, FAIL]
       FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/text-and-math/use-typo-metrics-1.html.ini b/third_party/blink/web_tests/external/wpt/mathml/relations/text-and-math/use-typo-metrics-1.html.ini
new file mode 100644
index 0000000..e3061c2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/text-and-math/use-typo-metrics-1.html.ini
@@ -0,0 +1,2 @@
+[use-typo-metrics-1.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
index 8788f3d6..0e0bff0 100644
--- a/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/content-type-parsing.html.ini
@@ -1,19 +1,61 @@
 [content-type-parsing.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): [TIMEOUT, OK]
   [content-type 0 : ,text/plain]
     expected: FAIL
 
   [content-type 1 : text/plain,]
     expected: FAIL
 
+  [content-type 10 : text/plain,*/*]
+    expected:
+      if (product == "content_shell") and (os == "win"): PASS
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [content-type 11 : text/html,*/*]
+    expected:
+      if (product == "content_shell") and (os == "win"): PASS
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [content-type 12 : */*,text/html]
+    expected:
+      if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
+      if (product == "content_shell") and (os == "mac"): FAIL
+
+  [content-type 13 : text/plain,*/*;charset=gbk]
+    expected:
+      if (product == "content_shell") and (os == "win") and (port == "win11"): PASS
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS
+      if (product == "content_shell") and (os == "mac"): PASS
+      FAIL
+
+  [content-type 14 : text/html,*/*;charset=gbk]
+    expected:
+      if (product == "content_shell") and (os == "mac"): PASS
+      if (product == "content_shell") and (os == "win"): PASS
+      FAIL
+
+  [content-type 15 : text/html;x=",text/plain]
+    expected: FAIL
+
+  [content-type 18 : text/html;",\\",text/plain,";charset=GBK]
+    expected: FAIL
+
+  [content-type 19 : text/html;",",text/plain]
+    expected: FAIL
+
   [content-type 2 : text/html,text/plain]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
+      if (product == "content_shell") and (os == "mac"): FAIL
 
   [content-type 3 : text/plain;charset=gbk,text/html]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
+      if (product == "content_shell") and (os == "mac"): FAIL
 
   [content-type 4 : text/plain;charset=gbk,text/html;charset=windows-1254]
     expected: FAIL
@@ -32,65 +74,13 @@
 
   [content-type 9 : text/html;charset=gbk,text/plain,text/html]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
-      FAIL
-
-  [content-type 10 : text/plain,*/*]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
-      FAIL
-
-  [content-type 11 : text/html,*/*]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
-      FAIL
-
-  [content-type 12 : */*,text/html]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [FAIL, PASS]
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
-
-  [content-type 13 : text/plain,*/*;charset=gbk]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): PASS
-      if (product == "content_shell") and (os == "win") and (port == "win11"): [PASS, FAIL]
-      FAIL
-
-  [content-type 14 : text/html,*/*;charset=gbk]
-    expected:
       if (product == "content_shell") and (os == "win"): PASS
+      if (product == "content_shell") and (os == "mac"): PASS
       FAIL
 
-  [content-type 15 : text/html;x=",text/plain]
-    expected: FAIL
-
-  [content-type 18 : text/html;",\\",text/plain,";charset=GBK]
-    expected: FAIL
-
-  [content-type 19 : text/html;",",text/plain]
-    expected: FAIL
-
   [mime-type 1 : text/html;charset=gbk]
     expected: FAIL
 
-  [mime-type 2 : TEXT/HTML;CHARSET=GBK]
-    expected: FAIL
-
-  [mime-type 4 : text/html;charset=gbk(]
-    expected: FAIL
-
-  [mime-type 5 : text/html;x=(;charset=gbk]
-    expected: FAIL
-
-  [mime-type 7 : text/html;charset=gbk;charset=windows-1255]
-    expected: FAIL
-
-  [mime-type 8 : text/html;charset=();charset=GBK]
-    expected: FAIL
-
   [mime-type 11 : text/html ;charset=gbk]
     expected: FAIL
 
@@ -103,6 +93,9 @@
   [mime-type 14 : text/html;charset= "gbk"]
     expected: FAIL
 
+  [mime-type 2 : TEXT/HTML;CHARSET=GBK]
+    expected: FAIL
+
   [mime-type 21 : text/html;charset='gbk']
     expected: FAIL
 
@@ -154,6 +147,9 @@
   [mime-type 39 : text/html;charset="gbk "]
     expected: FAIL
 
+  [mime-type 4 : text/html;charset=gbk(]
+    expected: FAIL
+
   [mime-type 40 : text/html;charset="\\ gbk"]
     expected: FAIL
 
@@ -175,5 +171,14 @@
   [mime-type 48 : text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk]
     expected: FAIL
 
+  [mime-type 5 : text/html;x=(;charset=gbk]
+    expected: FAIL
+
   [mime-type 69 : text/html;test=ÿ;charset=gbk]
     expected: FAIL
+
+  [mime-type 7 : text/html;charset=gbk;charset=windows-1255]
+    expected: FAIL
+
+  [mime-type 8 : text/html;charset=();charset=GBK]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/svg/shapes/reftests/pathlength-002.svg.ini b/third_party/blink/web_tests/external/wpt/svg/shapes/reftests/pathlength-002.svg.ini
new file mode 100644
index 0000000..99f7a4c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/shapes/reftests/pathlength-002.svg.ini
@@ -0,0 +1,2 @@
+[pathlength-002.svg]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
index 21c307b..85ab7a24 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 151 tests; 148 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 152 tests; 149 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Element.animate() creates an Animation object
 PASS Element.animate() creates an Animation object in the relevant realm of the target element
 PASS Element.animate() creates an Animation object with a KeyframeEffect
@@ -157,5 +157,6 @@
 FAIL animate() with a non-null invalid pseudoElement '::placeholder' throws a SyntaxError assert_throws_dom: function "() => {
       div.animate(null, {pseudoElement: pseudo});
     }" did not throw
+PASS Finished fill animation doesn't replace animation on a different pseudoElement
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
index dad633ba..7a5151a 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animatable/animate.html
@@ -342,5 +342,18 @@
      `SyntaxError`);
 }
 
+promise_test(async t => {
+  const div = createDiv(t);
+  div.classList.add('pseudo');
+  let animBefore = div.animate({opacity: [1, 0]}, {duration: 1, pseudoElement: '::before', fill: 'both'});
+  let animAfter = div.animate({opacity: [1, 0]}, {duration: 1, pseudoElement: '::after', fill: 'both'});
+  await animBefore.finished;
+  await animAfter.finished;
+  // The animation on ::before should not be replaced as it targets a different
+  // pseudo-element.
+  assert_equals(animBefore.replaceState, 'active');
+  assert_equals(animAfter.replaceState, 'active');
+}, 'Finished fill animation doesn\'t replace animation on a different pseudoElement');
+
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini
index 7598d73..2f53f6b 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/full-cycle-test.https.any.js.ini
@@ -1,30 +1,54 @@
-[full-cycle-test.https.any.worker.html?h264_annexb]
+[full-cycle-test.https.any.html?h264_annexb]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Encoding and decoding cycle]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
   [Encoding and decoding cycle w/ stripped color space]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
 
 [full-cycle-test.https.any.html?h264_avc]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Encoding and decoding cycle]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
   [Encoding and decoding cycle w/ stripped color space]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
+
+
+[full-cycle-test.https.any.worker.html?h264_annexb]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
+  [Encoding and decoding cycle]
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
+
+  [Encoding and decoding cycle w/ stripped color space]
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
 
 [full-cycle-test.https.any.worker.html?h264_avc]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Encoding and decoding cycle]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
   [Encoding and decoding cycle w/ stripped color space]
-    expected: PRECONDITION_FAILED
-
-
-[full-cycle-test.https.any.html?h264_annexb]
-  [Encoding and decoding cycle]
-    expected: PRECONDITION_FAILED
-
-  [Encoding and decoding cycle w/ stripped color space]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini
index 04c7129..c09e642 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/reconfiguring-encoder.https.any.js.ini
@@ -1,18 +1,34 @@
-[reconfiguring-encoder.https.any.html?h264_avc]
+[reconfiguring-encoder.https.any.html?h264_annexb]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Reconfiguring encoder]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
+
+
+[reconfiguring-encoder.https.any.html?h264_avc]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
+  [Reconfiguring encoder]
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
 
 [reconfiguring-encoder.https.any.worker.html?h264_annexb]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Reconfiguring encoder]
-    expected: PRECONDITION_FAILED
-
-
-[reconfiguring-encoder.https.any.html?h264_annexb]
-  [Reconfiguring encoder]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
 
 
 [reconfiguring-encoder.https.any.worker.html?h264_avc]
+  expected:
+    if (product == "content_shell") and (os == "mac"): ERROR
   [Reconfiguring encoder]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): FAIL
+      PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/temporal-svc-encoding.https.any.js.ini b/third_party/blink/web_tests/external/wpt/webcodecs/temporal-svc-encoding.https.any.js.ini
index db6dce68..d217851 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/temporal-svc-encoding.https.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/temporal-svc-encoding.https.any.js.ini
@@ -1,4 +1,6 @@
 [temporal-svc-encoding.https.any.html?h264]
+  expected:
+    if (product == "content_shell") and (os == "mac"): CRASH
   [SVC L1T2]
     expected: PRECONDITION_FAILED
 
@@ -7,6 +9,8 @@
 
 
 [temporal-svc-encoding.https.any.worker.html?h264]
+  expected:
+    if (product == "content_shell") and (os == "mac"): CRASH
   [SVC L1T2]
     expected: PRECONDITION_FAILED
 
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-relay-canvas.https.html.ini b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-relay-canvas.https.html.ini
new file mode 100644
index 0000000..7802b04
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-relay-canvas.https.html.ini
@@ -0,0 +1,3 @@
+[RTCPeerConnection-relay-canvas.https.html]
+  [Two PeerConnections relaying a canvas source]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/xhr/xhr-timeout-longtask.any.js.ini b/third_party/blink/web_tests/external/wpt/xhr/xhr-timeout-longtask.any.js.ini
new file mode 100644
index 0000000..c3c8ec0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/xhr/xhr-timeout-longtask.any.js.ini
@@ -0,0 +1,8 @@
+[xhr-timeout-longtask.any.html]
+  [Long tasks should not trigger load timeout]
+    expected: [FAIL, PASS]
+
+
+[xhr-timeout-longtask.any.worker.html]
+  [Long tasks should not trigger load timeout]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor-expected.txt
deleted file mode 100644
index abe3d2a6..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-Verifies that a deprecation issue is created when a deprecated permission string is used.
-
-Inspector issue: {
-    issue : {
-        code : DeprecationIssue
-        details : {
-            deprecationIssueDetails : {
-                affectedFrame : {
-                    frameId : <string>
-                }
-                sourceCodeLocation : {
-                    columnNumber : 23
-                    lineNumber : 0
-                    scriptId : <string>
-                    url : 
-                }
-                type : WindowPlacementPermissionDescriptorUsed
-            }
-        }
-    }
-}
-
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor.js
deleted file mode 100644
index cebc0be8..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-descriptor.js
+++ /dev/null
@@ -1,10 +0,0 @@
-(async function (testRunner) {
-  const { page, session, dp } = await testRunner.startBlank(
-    `Verifies that a deprecation issue is created when a deprecated permission string is used.\n`);
-  await dp.Audits.enable();
-  const promise = dp.Audits.onceIssueAdded();
-  session.evaluate("navigator.permissions.query({ name: 'window-placement' })");
-  const issue = await promise;
-  testRunner.log(issue.params, "Inspector issue: ");
-  testRunner.completeTest();
-})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header-expected.txt
deleted file mode 100644
index a4b44c1..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header-expected.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Verifies that a deprecation issue is created when a page header includes a deprecated permission policy.
-
-Inspector issue: {
-    issue : {
-        code : DeprecationIssue
-        details : {
-            deprecationIssueDetails : {
-                affectedFrame : {
-                    frameId : <string>
-                }
-                sourceCodeLocation : {
-                    columnNumber : 0
-                    lineNumber : -1
-                    url : 
-                }
-                type : WindowPlacementPermissionPolicyParsed
-            }
-        }
-    }
-}
-
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header.js
deleted file mode 100644
index 0678e6d..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/deprecation-issue-permission-policy-header.js
+++ /dev/null
@@ -1,11 +0,0 @@
-(async function (testRunner) {
-  const { page, session, dp } = await testRunner.startBlank(
-    `Verifies that a deprecation issue is created when a page header includes a deprecated permission policy.\n`);
-
-  await dp.Audits.enable();
-  page.navigate('http://127.0.0.1:8000/inspector-protocol/resources/permissions-policy-deprecated.php');
-  const issue = await dp.Audits.onceIssueAdded();
-
-  testRunner.log(issue.params, "Inspector issue: ");
-  testRunner.completeTest();
-})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/permissions-policy-deprecated.php b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/permissions-policy-deprecated.php
deleted file mode 100644
index c00c7e3..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/permissions-policy-deprecated.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-header('Permissions-Policy: window-placement=self');
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/cpu-profiling.js b/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/cpu-profiling.js
deleted file mode 100644
index aba4346..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/tracing/cpu-profiling.js
+++ /dev/null
@@ -1,98 +0,0 @@
-(async function(testRunner) {
-  const {session, dp} = await testRunner.startBlank(
-      'Tests the data of CPU profiling trace events');
-
-  const TracingHelper =
-      await testRunner.loadScript('../resources/tracing-test.js');
-  const Phase = TracingHelper.Phase;
-  const tracingHelper = new TracingHelper(testRunner, session);
-  await dp.Page.enable();
-
-  await tracingHelper.startTracing(
-      'v8,devtools.timeline,disabled-by-default-devtools.timeline,disabled-by-default-v8.cpu_profiler,disabled-by-default-v8.compile');
-  dp.Page.navigate({
-    url: 'http://127.0.0.1:8000/inspector-protocol/resources/cpu-profiling.html'
-  });
-  // Wait for the DOM to be interactive.
-  await dp.Page.onceLoadEventFired();
-
-  // Wait for trace events.
-  await session.evaluateAsync(`window.__blockingHandlerPromise`);
-  await session.evaluateAsync(`window.__modulePromise`);
-  await session.evaluateAsync(`window.__asyncScriptPromise`);
-
-  // Profiling events can take a while until they are dispatched.
-  await new Promise(res => setTimeout(res, 1000));
-
-  const allEvents = await tracingHelper.stopTracing(
-      /(disabled-by-default-)?devtools\.timeline|v8\.cpu_profiler|v8\.compile|v8/);
-
-  const compileScript = tracingHelper.findEvent('v8.compile', Phase.COMPLETE);
-  const compileCode = tracingHelper.findEvent('V8.CompileCode', Phase.COMPLETE);
-  const optimizeCode =
-      tracingHelper.findEvent('V8.OptimizeCode', Phase.COMPLETE);
-  const evaluateScript =
-      tracingHelper.findEvent('EvaluateScript', Phase.COMPLETE);
-  const cacheScript =
-      tracingHelper.findEvent('v8.produceCache', Phase.COMPLETE);
-  const compileModule =
-      tracingHelper.findEvent('v8.compileModule', Phase.COMPLETE);
-  const evaluateModule =
-      tracingHelper.findEvent('v8.evaluateModule', Phase.COMPLETE);
-  const cacheModule =
-      tracingHelper.findEvent('v8.produceModuleCache', Phase.COMPLETE);
-  const profile = tracingHelper.findEvent('Profile', Phase.SAMPLE);
-  const v8Execute = tracingHelper.findEvent('V8.Execute', Phase.COMPLETE);
-  const profileChunk = allEvents.find(
-      e => e.name === 'ProfileChunk' && e.args.data.cpuProfile &&
-          e.args.data.cpuProfile.nodes);
-
-  const parseOnBackground =
-      tracingHelper.findEvent('v8.parseOnBackground', Phase.COMPLETE);
-  const parseOnBackgroundParsing =
-      tracingHelper.findEvent('v8.parseOnBackgroundParsing', Phase.COMPLETE);
-
-  testRunner.log('Got a v8.compile event');
-  tracingHelper.logEventShape(compileScript, ['notStreamedReason', 'streamed']);
-
-  testRunner.log('Got a V8.CompileCode event');
-  tracingHelper.logEventShape(compileCode);
-
-  testRunner.log('Got a V8.OptimizeCode event');
-  tracingHelper.logEventShape(optimizeCode);
-
-  testRunner.log('Got an EvaluateScript event');
-  tracingHelper.logEventShape(evaluateScript);
-
-  testRunner.log('Got a v8.produceCache event');
-  tracingHelper.logEventShape(cacheScript);
-
-  testRunner.log('Got an v8.compileModule event');
-  tracingHelper.logEventShape(compileModule, ['notStreamedReason', 'streamed']);
-
-  testRunner.log('Got a v8.evaluateModule event');
-  tracingHelper.logEventShape(evaluateModule);
-
-  testRunner.log('Got a v8.produceModuleCache event');
-  tracingHelper.logEventShape(cacheModule);
-
-  testRunner.log('Got a V8.Execute event');
-  tracingHelper.logEventShape(v8Execute);
-
-  testRunner.log('Got a Profile event');
-  tracingHelper.logEventShape(profile);
-  testRunner.log('Got a ProfileChunk event');
-  testRunner.log('CPU profile has:');
-  const cpuProfile = profileChunk.args.data.cpuProfile;
-  testRunner.log('nodes:');
-  tracingHelper.logEventShape(cpuProfile.nodes[0]);
-  testRunner.log(`samples: ${typeof cpuProfile.samples[0]}`);
-  testRunner.log(`timeDeltas: ${typeof profileChunk.args.data.timeDeltas[0]}`);
-
-  testRunner.log('Got a v8.parseOnBackground event');
-  tracingHelper.logEventShape(parseOnBackground)
-
-  testRunner.log('Got a parseOnBackgroundParsing event');
-  tracingHelper.logEventShape(parseOnBackgroundParsing)
-  testRunner.completeTest();
-})
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index 0b79b6a..538731d 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -504,9 +504,8 @@
     property formTarget
     property labels
     property name
-    property popoverHideTargetElement
-    property popoverShowTargetElement
-    property popoverToggleTargetElement
+    property popoverTargetAction
+    property popoverTargetElement
     property reportValidity
     property setCustomValidity
     property type
@@ -753,9 +752,8 @@
     property name
     property pattern
     property placeholder
-    property popoverHideTargetElement
-    property popoverShowTargetElement
-    property popoverToggleTargetElement
+    property popoverTargetAction
+    property popoverTargetElement
     property readOnly
     property reportValidity
     property required
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 784dfab..745d146 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
@@ -3137,9 +3137,8 @@
     getter formTarget
     getter labels
     getter name
-    getter popoverHideTargetElement
-    getter popoverShowTargetElement
-    getter popoverToggleTargetElement
+    getter popoverTargetAction
+    getter popoverTargetElement
     getter type
     getter validationMessage
     getter validity
@@ -3156,9 +3155,8 @@
     setter formNoValidate
     setter formTarget
     setter name
-    setter popoverHideTargetElement
-    setter popoverShowTargetElement
-    setter popoverToggleTargetElement
+    setter popoverTargetAction
+    setter popoverTargetElement
     setter type
     setter value
 interface HTMLCanvasElement : HTMLElement
@@ -3804,9 +3802,8 @@
     getter name
     getter pattern
     getter placeholder
-    getter popoverHideTargetElement
-    getter popoverShowTargetElement
-    getter popoverToggleTargetElement
+    getter popoverTargetAction
+    getter popoverTargetElement
     getter readOnly
     getter required
     getter selectionDirection
@@ -3862,9 +3859,8 @@
     setter name
     setter pattern
     setter placeholder
-    setter popoverHideTargetElement
-    setter popoverShowTargetElement
-    setter popoverToggleTargetElement
+    setter popoverTargetAction
+    setter popoverTargetElement
     setter readOnly
     setter required
     setter selectionDirection
diff --git a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
index 87ac3f5..d0ce9d2 100644
--- a/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/view-transition-on-navigation/root-element-transition.html.ini
@@ -1,2 +1,4 @@
 [root-element-transition.html]
-  expected: FAIL
+  expected:
+    if product == "chrome": ERROR
+    FAIL
diff --git a/third_party/cardboard/BUILD.gn b/third_party/cardboard/BUILD.gn
index b0abbea..663076c 100644
--- a/third_party/cardboard/BUILD.gn
+++ b/third_party/cardboard/BUILD.gn
@@ -76,7 +76,6 @@
     "src/sdk/head_tracker.cc",
     "src/sdk/head_tracker.h",
     "src/sdk/include/cardboard.h",
-    "src/sdk/jni_utils/android/jni_utils.cc",
     "src/sdk/jni_utils/android/jni_utils.h",
     "src/sdk/lens_distortion.cc",
     "src/sdk/lens_distortion.h",
@@ -130,9 +129,12 @@
     "src/sdk/util/vector.h",
     "src/sdk/util/vectorutils.cc",
     "src/sdk/util/vectorutils.h",
+    "src_overrides/sdk/jni_utils/android/jni_utils.cc",
     "src_overrides/sdk/sensors/android/device_gyroscope_sensor.cc",
   ]
 
+  deps = [ "//base" ]
+
   include_dirs = [ "src/sdk" ]
 
   libs = [
diff --git a/third_party/cardboard/README.chromium b/third_party/cardboard/README.chromium
index 78f54057..fea5f4e43 100644
--- a/third_party/cardboard/README.chromium
+++ b/third_party/cardboard/README.chromium
@@ -11,6 +11,7 @@
 smartphones inserted into Cardboard viewers.
 
 Local Modifications:
-Created local top-level BUILD.gn based on src/sdk/build.gradle
-Created local proguard-rules.pro to remove wildcard rules
-Created local override for device_gyroscope_sensor to remove static initializers
+* Created local top-level BUILD.gn based on src/sdk/build.gradle
+* Created local proguard-rules.pro to remove wildcard rules
+* Created local override for device_gyroscope_sensor to remove static initializers
+* Created local override for LoadJClass in jni_utils to leaverage //base JNI loading due to splits.
diff --git a/third_party/cardboard/src_overrides/DEPS b/third_party/cardboard/src_overrides/DEPS
new file mode 100644
index 0000000..2975b268
--- /dev/null
+++ b/third_party/cardboard/src_overrides/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+base/android/jni_android.h",
+]
diff --git a/third_party/cardboard/src_overrides/sdk/jni_utils/android/jni_utils.cc b/third_party/cardboard/src_overrides/sdk/jni_utils/android/jni_utils.cc
new file mode 100644
index 0000000..75907128
--- /dev/null
+++ b/third_party/cardboard/src_overrides/sdk/jni_utils/android/jni_utils.cc
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "third_party/cardboard/src/jni_utils/android/jni_utils.h"
+
+#include "base/android/jni_android.h"
+#include "third_party/cardboard/src/util/logging.h"
+
+namespace cardboard::jni {
+namespace {
+
+jclass runtime_excepton_class_;
+
+void LoadJNIResources(JNIEnv* env) {
+  runtime_excepton_class_ =
+      cardboard::jni::LoadJClass(env, "java/lang/RuntimeException");
+}
+
+}  // anonymous namespace
+
+void initializeAndroid(JavaVM* vm, jobject /*context*/) {
+  JNIEnv* env;
+  LoadJNIEnv(vm, &env);
+  LoadJNIResources(env);
+}
+
+bool CheckExceptionInJava(JNIEnv* env) {
+  const bool exception_occurred = env->ExceptionOccurred();
+  if (exception_occurred) {
+    env->ExceptionDescribe();
+    env->ExceptionClear();
+  }
+  return exception_occurred;
+}
+
+void LoadJNIEnv(JavaVM* vm, JNIEnv** env) {
+  switch (vm->GetEnv(reinterpret_cast<void**>(env), JNI_VERSION_1_6)) {
+    case JNI_OK:
+      break;
+    case JNI_EDETACHED:
+      if (vm->AttachCurrentThread(env, nullptr) != 0) {
+        *env = nullptr;
+      }
+      break;
+    default:
+      *env = nullptr;
+      break;
+  }
+}
+
+jclass LoadJClass(JNIEnv* env, const char* class_name) {
+  auto local_ref = base::android::GetClass(env, class_name);
+  CheckExceptionInJava(env);
+  return static_cast<jclass>(env->NewGlobalRef(local_ref.obj()));
+}
+
+void ThrowJavaRuntimeException(JNIEnv* env, const char* msg) {
+  CARDBOARD_LOGE("Throw Java RuntimeException: %s", msg);
+  env->ThrowNew(runtime_excepton_class_, msg);
+}
+
+}  // namespace cardboard::jni
diff --git a/third_party/content_analysis_sdk/BUILD.gn b/third_party/content_analysis_sdk/BUILD.gn
index a0eeae2..88cb73a 100644
--- a/third_party/content_analysis_sdk/BUILD.gn
+++ b/third_party/content_analysis_sdk/BUILD.gn
@@ -56,6 +56,8 @@
     "src/agent/src/agent_base.h",
     "src/agent/src/event_base.cc",
     "src/agent/src/event_base.h",
+    "src/agent/src/scoped_print_handle_base.cc",
+    "src/agent/src/scoped_print_handle_base.h",
   ]
 
   if (is_win) {
@@ -66,6 +68,8 @@
       "src/agent/src/agent_win.h",
       "src/agent/src/event_win.cc",
       "src/agent/src/event_win.h",
+      "src/agent/src/scoped_print_handle_win.cc",
+      "src/agent/src/scoped_print_handle_win.h",
       "src/common/utils_win.cc",
       "src/common/utils_win.h",
     ]
@@ -75,6 +79,8 @@
       "src/agent/src/agent_mac.h",
       "src/agent/src/event_mac.cc",
       "src/agent/src/event_mac.h",
+      "src/agent/src/scoped_print_handle_mac.cc",
+      "src/agent/src/scoped_print_handle_mac.h",
     ]
   } else {
     sources += [
@@ -82,6 +88,8 @@
       "src/agent/src/agent_posix.h",
       "src/agent/src/event_posix.cc",
       "src/agent/src/event_posix.h",
+      "src/agent/src/scoped_print_handle_posix.cc",
+      "src/agent/src/scoped_print_handle_posix.h",
     ]
   }
 
diff --git a/third_party/hunspell/google/bdict_writer.h b/third_party/hunspell/google/bdict_writer.h
index 7b62a5b..1c0fd767 100644
--- a/third_party/hunspell/google/bdict_writer.h
+++ b/third_party/hunspell/google/bdict_writer.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_HUNSPELL_GOOGLE_BDICT_WRITER_H_
 
 #include <string>
+#include <utility>
 #include <vector>
 
 namespace hunspell {
diff --git a/third_party/jacoco/BUILD.gn b/third_party/jacoco/BUILD.gn
index 93ebbe5..494b0710 100644
--- a/third_party/jacoco/BUILD.gn
+++ b/third_party/jacoco/BUILD.gn
@@ -45,20 +45,20 @@
 
 java_prebuilt("org_jacocoagent_java") {
   testonly = true
-  jar_path = "lib/org.jacoco.agent-0.8.3.201901230119.jar"
+  jar_path = "lib/org.jacoco.agent-0.8.8.202204050719.jar"
 }
 
 java_prebuilt("org_jacocoant_java") {
   testonly = true
-  jar_path = "lib/org.jacoco.ant-0.8.3.201901230119.jar"
+  jar_path = "lib/org.jacoco.ant-0.8.8.202204050719.jar"
 }
 
 java_prebuilt("org_jacococore_java") {
   testonly = true
-  jar_path = "lib/org.jacoco.core-0.8.3.201901230119.jar"
+  jar_path = "lib/org.jacoco.core-0.8.8.202204050719.jar"
 }
 
 java_prebuilt("org_jacocoreport_java") {
   testonly = true
-  jar_path = "lib/org.jacoco.report-0.8.3.201901230119.jar"
+  jar_path = "lib/org.jacoco.report-0.8.8.202204050719.jar"
 }
diff --git a/third_party/jacoco/README.chromium b/third_party/jacoco/README.chromium
index 002de04..b13b56e 100644
--- a/third_party/jacoco/README.chromium
+++ b/third_party/jacoco/README.chromium
@@ -1,6 +1,6 @@
 Name: JaCoCo
-URL: https://repo1.maven.org/maven2/org/jacoco/jacoco/
-Version: 8.3.2
+URL: http://central.maven.org/maven2/org/jacoco/jacoco/
+Version: 0.8.8
 License: EPL 1.0
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/jacoco/cipd.yaml b/third_party/jacoco/cipd.yaml
deleted file mode 100644
index 3fcacf2..0000000
--- a/third_party/jacoco/cipd.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2017 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# To create CIPD package run the following command.
-# cipd create --pkg-def cipd.yaml -tag version:$(cat version.txt)
-package: chromium/third_party/jacoco
-description: Jacoco code coverage package
-data:
-  - file: lib/jacocoagent.jar
-  - file: lib/jacocoant.jar
-  - file: lib/jacococli.jar
-  - file: lib/org.jacoco.agent-0.8.3.201901230119.jar
-  - file: lib/org.jacoco.ant-0.8.3.201901230119.jar
-  - file: lib/org.jacoco.core-0.8.3.201901230119.jar
-  - file: lib/org.jacoco.report-0.8.3.201901230119.jar
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium
index 6d0a1fa..6f510db 100644
--- a/third_party/libxml/README.chromium
+++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@
 Name: libxml
 URL: http://xmlsoft.org
-Version: 1eb2ca9f471909bae931aa09b257ac0dd41a30f5
+Version: f931178e5f46da72843c675b217db94cf9df70ee
 CPEPrefix: cpe:/a:xmlsoft:libxml2:2.11.0
 License: MIT
 License File: src/Copyright
diff --git a/third_party/libxml/chromium/roll.py b/third_party/libxml/chromium/roll.py
index 78181e4d..9fc5a97 100755
--- a/third_party/libxml/chromium/roll.py
+++ b/third_party/libxml/chromium/roll.py
@@ -214,6 +214,11 @@
     'src/xpointer.c',
     'src/xstc',
     'src/xzlib.c',
+    'linux/.deps',
+    'linux/doc',
+    'linux/example',
+    'linux/fuzz',
+    'linux/python',
 ]
 
 
diff --git a/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo b/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-HTMLparser.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo b/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-HTMLtree.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo b/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-SAX.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo b/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-SAX2.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-buf.Plo b/third_party/libxml/linux/.deps/libxml2_la-buf.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-buf.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo b/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-c14n.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo b/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-catalog.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo b/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-chvalid.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo b/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-debugXML.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-dict.Plo b/third_party/libxml/linux/.deps/libxml2_la-dict.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-dict.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo b/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-encoding.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-entities.Plo b/third_party/libxml/linux/.deps/libxml2_la-entities.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-entities.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-error.Plo b/third_party/libxml/linux/.deps/libxml2_la-error.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-error.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-globals.Plo b/third_party/libxml/linux/.deps/libxml2_la-globals.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-globals.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-hash.Plo b/third_party/libxml/linux/.deps/libxml2_la-hash.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-hash.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo b/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-legacy.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-list.Plo b/third_party/libxml/linux/.deps/libxml2_la-list.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-list.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo b/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-nanoftp.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo b/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-nanohttp.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-parser.Plo b/third_party/libxml/linux/.deps/libxml2_la-parser.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-parser.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo b/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-parserInternals.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo b/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-pattern.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo b/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-relaxng.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo b/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-schematron.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-threads.Plo b/third_party/libxml/linux/.deps/libxml2_la-threads.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-threads.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-tree.Plo b/third_party/libxml/linux/.deps/libxml2_la-tree.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-tree.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-trio.Plo b/third_party/libxml/linux/.deps/libxml2_la-trio.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-trio.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo b/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-triostr.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-uri.Plo b/third_party/libxml/linux/.deps/libxml2_la-uri.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-uri.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-valid.Plo b/third_party/libxml/linux/.deps/libxml2_la-valid.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-valid.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo b/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xinclude.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo b/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xlink.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlIO.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlmemory.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlmodule.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlreader.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlregexp.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlsave.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlschemas.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlschemastypes.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlstring.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlunicode.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo b/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xmlwriter.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo b/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xpath.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo b/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xpointer.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo b/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/libxml2_la-xzlib.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/runsuite.Po b/third_party/libxml/linux/.deps/runsuite.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/runsuite.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/runtest-runtest.Po b/third_party/libxml/linux/.deps/runtest-runtest.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/runtest-runtest.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/runxmlconf.Po b/third_party/libxml/linux/.deps/runxmlconf.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/runxmlconf.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testModule.Po b/third_party/libxml/linux/.deps/testModule.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testModule.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testThreads-testThreads.Po b/third_party/libxml/linux/.deps/testThreads-testThreads.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testThreads-testThreads.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testapi.Po b/third_party/libxml/linux/.deps/testapi.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testapi.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testchar.Po b/third_party/libxml/linux/.deps/testchar.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testchar.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testdict.Po b/third_party/libxml/linux/.deps/testdict.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testdict.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testdso.Plo b/third_party/libxml/linux/.deps/testdso.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testdso.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testlimits.Po b/third_party/libxml/linux/.deps/testlimits.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testlimits.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/testrecurse.Po b/third_party/libxml/linux/.deps/testrecurse.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/testrecurse.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/xmlcatalog.Po b/third_party/libxml/linux/.deps/xmlcatalog.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/xmlcatalog.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/.deps/xmllint-xmllint.Po b/third_party/libxml/linux/.deps/xmllint-xmllint.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/.deps/xmllint-xmllint.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/Makefile b/third_party/libxml/linux/doc/Makefile
deleted file mode 100644
index 4ab8a0e..0000000
--- a/third_party/libxml/linux/doc/Makefile
+++ /dev/null
@@ -1,886 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# doc/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-subdir = doc
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(nobase_dist_doc_DATA) \
-	$(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-	ctags-recursive dvi-recursive html-recursive info-recursive \
-	install-data-recursive install-dvi-recursive \
-	install-exec-recursive install-html-recursive \
-	install-info-recursive install-pdf-recursive \
-	install-ps-recursive install-recursive installcheck-recursive \
-	installdirs-recursive pdf-recursive ps-recursive \
-	tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-man1dir = $(mandir)/man1
-am__installdirs = "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"
-NROFF = nroff
-MANS = $(dist_man_MANS)
-DATA = $(nobase_dist_doc_DATA)
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-	distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../
-top_builddir = ..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-SUBDIRS = . devhelp examples
-nobase_dist_doc_DATA = \
-	tutorial/apa.html \
-	tutorial/apb.html \
-	tutorial/apc.html \
-	tutorial/apd.html \
-	tutorial/ape.html \
-	tutorial/apf.html \
-	tutorial/apg.html \
-	tutorial/aph.html \
-	tutorial/api.html \
-	tutorial/ar01s02.html \
-	tutorial/ar01s03.html \
-	tutorial/ar01s04.html \
-	tutorial/ar01s05.html \
-	tutorial/ar01s06.html \
-	tutorial/ar01s07.html \
-	tutorial/ar01s08.html \
-	tutorial/ar01s09.html \
-	tutorial/images/blank.png \
-	tutorial/images/callouts/1.png \
-	tutorial/images/callouts/10.png \
-	tutorial/images/callouts/2.png \
-	tutorial/images/callouts/3.png \
-	tutorial/images/callouts/4.png \
-	tutorial/images/callouts/5.png \
-	tutorial/images/callouts/6.png \
-	tutorial/images/callouts/7.png \
-	tutorial/images/callouts/8.png \
-	tutorial/images/callouts/9.png \
-	tutorial/images/caution.png \
-	tutorial/images/draft.png \
-	tutorial/images/home.png \
-	tutorial/images/important.png \
-	tutorial/images/next.png \
-	tutorial/images/note.png \
-	tutorial/images/prev.png \
-	tutorial/images/tip.png \
-	tutorial/images/toc-blank.png \
-	tutorial/images/toc-minus.png \
-	tutorial/images/toc-plus.png \
-	tutorial/images/up.png \
-	tutorial/images/warning.png \
-	tutorial/includeaddattribute.c \
-	tutorial/includeaddkeyword.c \
-	tutorial/includeconvert.c \
-	tutorial/includegetattribute.c \
-	tutorial/includekeyword.c \
-	tutorial/includexpath.c \
-	tutorial/index.html \
-	tutorial/ix01.html \
-	xmlcatalog.html \
-	xmllint.html
-
-dist_man_MANS = xml2-config.1 xmllint.1 xmlcatalog.1
-EXTRA_DIST = \
-	apibuild.py \
-	libxml2-api.xml \
-	xmlcatalog.xml \
-	xmllint.xml
-
-DOCBOOK_HTML = http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-man1: $(dist_man_MANS)
-	@$(NORMAL_INSTALL)
-	@list1=''; \
-	list2='$(dist_man_MANS)'; \
-	test -n "$(man1dir)" \
-	  && test -n "`echo $$list1$$list2`" \
-	  || exit 0; \
-	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
-	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
-	{ for i in $$list1; do echo "$$i"; done;  \
-	if test -n "$$list2"; then \
-	  for i in $$list2; do echo "$$i"; done \
-	    | sed -n '/\.1[a-z]*$$/p'; \
-	fi; \
-	} | while read p; do \
-	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; echo "$$p"; \
-	done | \
-	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
-	sed 'N;N;s,\n, ,g' | { \
-	list=; while read file base inst; do \
-	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
-	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
-	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
-	  fi; \
-	done; \
-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
-	while read files; do \
-	  test -z "$$files" || { \
-	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
-	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
-	done; }
-
-uninstall-man1:
-	@$(NORMAL_UNINSTALL)
-	@list=''; test -n "$(man1dir)" || exit 0; \
-	files=`{ for i in $$list; do echo "$$i"; done; \
-	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
-	  sed -n '/\.1[a-z]*$$/p'; \
-	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
-	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
-install-nobase_dist_docDATA: $(nobase_dist_doc_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
-	fi; \
-	$(am__nobase_list) | while read dir files; do \
-	  xfiles=; for file in $$files; do \
-	    if test -f "$$file"; then xfiles="$$xfiles $$file"; \
-	    else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
-	  test -z "$$xfiles" || { \
-	    test "x$$dir" = x. || { \
-	      echo " $(MKDIR_P) '$(DESTDIR)$(docdir)/$$dir'"; \
-	      $(MKDIR_P) "$(DESTDIR)$(docdir)/$$dir"; }; \
-	    echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(docdir)/$$dir'"; \
-	    $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(docdir)/$$dir" || exit $$?; }; \
-	done
-
-uninstall-nobase_dist_docDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nobase_dist_doc_DATA)'; test -n "$(docdir)" || list=; \
-	$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
-	dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-	@fail=; \
-	if $(am__make_keepgoing); then \
-	  failcom='fail=yes'; \
-	else \
-	  failcom='exit 1'; \
-	fi; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(MANS) $(DATA)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(docdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-man install-nobase_dist_docDATA
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man: install-man1
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-man uninstall-nobase_dist_docDATA
-
-uninstall-man: uninstall-man1
-
-.MAKE: $(am__recursive_targets) install-am install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
-	check-am clean clean-generic clean-libtool cscopelist-am ctags \
-	ctags-am distclean distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-man1 install-nobase_dist_docDATA install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am uninstall-man \
-	uninstall-man1 uninstall-nobase_dist_docDATA
-
-.PRECIOUS: Makefile
-
-
-rebuild:
-	cd $(srcdir) && ./apibuild.py
-	cd $(srcdir) && $(XSLTPROC) -o ../win32/libxml2.def.src ../win32/defgen.xsl libxml2-api.xml
-	cd $(srcdir) && $(XSLTPROC) --nonet xmllint.xml
-	cd $(srcdir) && $(XSLTPROC) --nonet -o xmllint.html $(DOCBOOK_HTML) xmllint.xml
-	cd $(srcdir) && $(XSLTPROC) --nonet xmlcatalog.xml
-	cd $(srcdir) && $(XSLTPROC) --nonet -o xmlcatalog.html $(DOCBOOK_HTML) xmlcatalog.xml
-	cd devhelp && $(MAKE) rebuild
-	cd examples && $(MAKE) rebuild
-	cd .. && $(MAKE) rebuild_testapi
-
-.PHONY: rebuild
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/doc/devhelp/Makefile b/third_party/libxml/linux/doc/devhelp/Makefile
deleted file mode 100644
index 09140c4c..0000000
--- a/third_party/libxml/linux/doc/devhelp/Makefile
+++ /dev/null
@@ -1,651 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# doc/devhelp/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-subdir = doc/devhelp
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(dist_devhelp_DATA) \
-	$(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(devhelpdir)"
-DATA = $(dist_devhelp_DATA)
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc/devhelp
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/devhelp
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../../
-top_builddir = ../..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-devhelpdir = $(datadir)/gtk-doc/html/libxml2
-dist_devhelp_DATA = \
-	libxml2.devhelp2		\
-	$(HTML_FILES)			\
-	$(EXTRA_FORMAT)
-
-HTML_FILES = \
-	general.html			\
-	index.html			\
-	$(HTML_MODULES)
-
-HTML_MODULES = \
-	libxml2-c14n.html		\
-	libxml2-catalog.html		\
-	libxml2-chvalid.html		\
-	libxml2-debugXML.html		\
-	libxml2-dict.html		\
-	libxml2-encoding.html		\
-	libxml2-entities.html		\
-	libxml2-globals.html		\
-	libxml2-hash.html		\
-	libxml2-HTMLparser.html		\
-	libxml2-HTMLtree.html		\
-	libxml2-list.html		\
-	libxml2-nanoftp.html		\
-	libxml2-nanohttp.html		\
-	libxml2-parser.html		\
-	libxml2-parserInternals.html	\
-	libxml2-pattern.html		\
-	libxml2-relaxng.html		\
-	libxml2-SAX2.html		\
-	libxml2-SAX.html		\
-	libxml2-schemasInternals.html	\
-	libxml2-schematron.html		\
-	libxml2-threads.html		\
-	libxml2-tree.html		\
-	libxml2-uri.html		\
-	libxml2-valid.html		\
-	libxml2-xinclude.html		\
-	libxml2-xlink.html		\
-	libxml2-xmlautomata.html	\
-	libxml2-xmlerror.html		\
-	libxml2-xmlexports.html		\
-	libxml2-xmlIO.html		\
-	libxml2-xmlmemory.html		\
-	libxml2-xmlmodule.html		\
-	libxml2-xmlreader.html		\
-	libxml2-xmlregexp.html		\
-	libxml2-xmlsave.html		\
-	libxml2-xmlschemas.html		\
-	libxml2-xmlschemastypes.html	\
-	libxml2-xmlstring.html		\
-	libxml2-xmlunicode.html		\
-	libxml2-xmlversion.html		\
-	libxml2-xmlwriter.html		\
-	libxml2-xpath.html		\
-	libxml2-xpathInternals.html	\
-	libxml2-xpointer.html
-
-EXTRA_FORMAT = \
-	home.png			\
-	left.png			\
-	right.png			\
-	up.png				\
-	style.css
-
-EXTRA_DIST = devhelp2.xsl html.xsl
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/devhelp/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/devhelp/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-dist_devhelpDATA: $(dist_devhelp_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(devhelpdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(devhelpdir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(devhelpdir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(devhelpdir)" || exit $$?; \
-	done
-
-uninstall-dist_devhelpDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_devhelp_DATA)'; test -n "$(devhelpdir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(devhelpdir)'; $(am__uninstall_files_from_dir)
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(DATA)
-installdirs:
-	for dir in "$(DESTDIR)$(devhelpdir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-dist_devhelpDATA
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-dist_devhelpDATA
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	cscopelist-am ctags-am distclean distclean-generic \
-	distclean-libtool distdir dvi dvi-am html html-am info info-am \
-	install install-am install-data install-data-am \
-	install-dist_devhelpDATA install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \
-	uninstall-am uninstall-dist_devhelpDATA
-
-.PRECIOUS: Makefile
-
-
-rebuild:
-	(cd $(srcdir) && $(XSLTPROC) -o libxml2.devhelp2 devhelp2.xsl ../libxml2-api.xml)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/doc/examples/.deps/io1.Po b/third_party/libxml/linux/doc/examples/.deps/io1.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/io1.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/io2.Po b/third_party/libxml/linux/doc/examples/.deps/io2.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/io2.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse1.Po b/third_party/libxml/linux/doc/examples/.deps/parse1.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/parse1.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse2.Po b/third_party/libxml/linux/doc/examples/.deps/parse2.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/parse2.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse3.Po b/third_party/libxml/linux/doc/examples/.deps/parse3.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/parse3.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/parse4.Po b/third_party/libxml/linux/doc/examples/.deps/parse4.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/parse4.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader1.Po b/third_party/libxml/linux/doc/examples/.deps/reader1.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/reader1.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader2.Po b/third_party/libxml/linux/doc/examples/.deps/reader2.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/reader2.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader3.Po b/third_party/libxml/linux/doc/examples/.deps/reader3.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/reader3.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/reader4.Po b/third_party/libxml/linux/doc/examples/.deps/reader4.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/reader4.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/testWriter.Po b/third_party/libxml/linux/doc/examples/.deps/testWriter.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/testWriter.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/tree1.Po b/third_party/libxml/linux/doc/examples/.deps/tree1.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/tree1.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/tree2.Po b/third_party/libxml/linux/doc/examples/.deps/tree2.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/tree2.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/xpath1.Po b/third_party/libxml/linux/doc/examples/.deps/xpath1.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/xpath1.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/.deps/xpath2.Po b/third_party/libxml/linux/doc/examples/.deps/xpath2.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/doc/examples/.deps/xpath2.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/doc/examples/Makefile b/third_party/libxml/linux/doc/examples/Makefile
deleted file mode 100644
index de49a6e..0000000
--- a/third_party/libxml/linux/doc/examples/Makefile
+++ /dev/null
@@ -1,939 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# doc/examples/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-check_PROGRAMS = io1$(EXEEXT) io2$(EXEEXT) parse1$(EXEEXT) \
-	parse2$(EXEEXT) parse3$(EXEEXT) parse4$(EXEEXT) \
-	reader1$(EXEEXT) reader2$(EXEEXT) reader3$(EXEEXT) \
-	reader4$(EXEEXT) testWriter$(EXEEXT) tree1$(EXEEXT) \
-	tree2$(EXEEXT) xpath1$(EXEEXT) xpath2$(EXEEXT)
-subdir = doc/examples
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am_io1_OBJECTS = io1.$(OBJEXT)
-io1_OBJECTS = $(am_io1_OBJECTS)
-io1_LDADD = $(LDADD)
-io1_DEPENDENCIES = $(top_builddir)/libxml2.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-am__v_lt_1 = 
-am_io2_OBJECTS = io2.$(OBJEXT)
-io2_OBJECTS = $(am_io2_OBJECTS)
-io2_LDADD = $(LDADD)
-io2_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_parse1_OBJECTS = parse1.$(OBJEXT)
-parse1_OBJECTS = $(am_parse1_OBJECTS)
-parse1_LDADD = $(LDADD)
-parse1_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_parse2_OBJECTS = parse2.$(OBJEXT)
-parse2_OBJECTS = $(am_parse2_OBJECTS)
-parse2_LDADD = $(LDADD)
-parse2_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_parse3_OBJECTS = parse3.$(OBJEXT)
-parse3_OBJECTS = $(am_parse3_OBJECTS)
-parse3_LDADD = $(LDADD)
-parse3_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_parse4_OBJECTS = parse4.$(OBJEXT)
-parse4_OBJECTS = $(am_parse4_OBJECTS)
-parse4_LDADD = $(LDADD)
-parse4_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_reader1_OBJECTS = reader1.$(OBJEXT)
-reader1_OBJECTS = $(am_reader1_OBJECTS)
-reader1_LDADD = $(LDADD)
-reader1_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_reader2_OBJECTS = reader2.$(OBJEXT)
-reader2_OBJECTS = $(am_reader2_OBJECTS)
-reader2_LDADD = $(LDADD)
-reader2_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_reader3_OBJECTS = reader3.$(OBJEXT)
-reader3_OBJECTS = $(am_reader3_OBJECTS)
-reader3_LDADD = $(LDADD)
-reader3_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_reader4_OBJECTS = reader4.$(OBJEXT)
-reader4_OBJECTS = $(am_reader4_OBJECTS)
-reader4_LDADD = $(LDADD)
-reader4_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_testWriter_OBJECTS = testWriter.$(OBJEXT)
-testWriter_OBJECTS = $(am_testWriter_OBJECTS)
-testWriter_LDADD = $(LDADD)
-testWriter_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_tree1_OBJECTS = tree1.$(OBJEXT)
-tree1_OBJECTS = $(am_tree1_OBJECTS)
-tree1_LDADD = $(LDADD)
-tree1_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_tree2_OBJECTS = tree2.$(OBJEXT)
-tree2_OBJECTS = $(am_tree2_OBJECTS)
-tree2_LDADD = $(LDADD)
-tree2_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_xpath1_OBJECTS = xpath1.$(OBJEXT)
-xpath1_OBJECTS = $(am_xpath1_OBJECTS)
-xpath1_LDADD = $(LDADD)
-xpath1_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_xpath2_OBJECTS = xpath2.$(OBJEXT)
-xpath2_OBJECTS = $(am_xpath2_OBJECTS)
-xpath2_LDADD = $(LDADD)
-xpath2_DEPENDENCIES = $(top_builddir)/libxml2.la
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/io1.Po ./$(DEPDIR)/io2.Po \
-	./$(DEPDIR)/parse1.Po ./$(DEPDIR)/parse2.Po \
-	./$(DEPDIR)/parse3.Po ./$(DEPDIR)/parse4.Po \
-	./$(DEPDIR)/reader1.Po ./$(DEPDIR)/reader2.Po \
-	./$(DEPDIR)/reader3.Po ./$(DEPDIR)/reader4.Po \
-	./$(DEPDIR)/testWriter.Po ./$(DEPDIR)/tree1.Po \
-	./$(DEPDIR)/tree2.Po ./$(DEPDIR)/xpath1.Po \
-	./$(DEPDIR)/xpath2.Po
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
-	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
-	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
-	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
-	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
-DIST_SOURCES = $(io1_SOURCES) $(io2_SOURCES) $(parse1_SOURCES) \
-	$(parse2_SOURCES) $(parse3_SOURCES) $(parse4_SOURCES) \
-	$(reader1_SOURCES) $(reader2_SOURCES) $(reader3_SOURCES) \
-	$(reader4_SOURCES) $(testWriter_SOURCES) $(tree1_SOURCES) \
-	$(tree2_SOURCES) $(xpath1_SOURCES) $(xpath2_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/doc/examples
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/doc/examples
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../../
-top_builddir = ../..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = $(top_builddir)/libxml2.la
-CLEANFILES = *.tmp
-EXTRA_DIST = \
-	examples.xml \
-	examples.xsl \
-	index.html \
-	index.py \
-	test1.xml \
-	test2.xml \
-	test3.xml
-
-io1_SOURCES = io1.c
-io2_SOURCES = io2.c
-parse1_SOURCES = parse1.c
-parse2_SOURCES = parse2.c
-parse3_SOURCES = parse3.c
-parse4_SOURCES = parse4.c
-reader1_SOURCES = reader1.c
-reader2_SOURCES = reader2.c
-reader3_SOURCES = reader3.c
-reader4_SOURCES = reader4.c
-testWriter_SOURCES = testWriter.c
-tree1_SOURCES = tree1.c
-tree2_SOURCES = tree2.c
-xpath1_SOURCES = xpath1.c
-xpath2_SOURCES = xpath2.c
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/examples/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign doc/examples/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-checkPROGRAMS:
-	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-io1$(EXEEXT): $(io1_OBJECTS) $(io1_DEPENDENCIES) $(EXTRA_io1_DEPENDENCIES) 
-	@rm -f io1$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(io1_OBJECTS) $(io1_LDADD) $(LIBS)
-
-io2$(EXEEXT): $(io2_OBJECTS) $(io2_DEPENDENCIES) $(EXTRA_io2_DEPENDENCIES) 
-	@rm -f io2$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(io2_OBJECTS) $(io2_LDADD) $(LIBS)
-
-parse1$(EXEEXT): $(parse1_OBJECTS) $(parse1_DEPENDENCIES) $(EXTRA_parse1_DEPENDENCIES) 
-	@rm -f parse1$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(parse1_OBJECTS) $(parse1_LDADD) $(LIBS)
-
-parse2$(EXEEXT): $(parse2_OBJECTS) $(parse2_DEPENDENCIES) $(EXTRA_parse2_DEPENDENCIES) 
-	@rm -f parse2$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(parse2_OBJECTS) $(parse2_LDADD) $(LIBS)
-
-parse3$(EXEEXT): $(parse3_OBJECTS) $(parse3_DEPENDENCIES) $(EXTRA_parse3_DEPENDENCIES) 
-	@rm -f parse3$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(parse3_OBJECTS) $(parse3_LDADD) $(LIBS)
-
-parse4$(EXEEXT): $(parse4_OBJECTS) $(parse4_DEPENDENCIES) $(EXTRA_parse4_DEPENDENCIES) 
-	@rm -f parse4$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(parse4_OBJECTS) $(parse4_LDADD) $(LIBS)
-
-reader1$(EXEEXT): $(reader1_OBJECTS) $(reader1_DEPENDENCIES) $(EXTRA_reader1_DEPENDENCIES) 
-	@rm -f reader1$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(reader1_OBJECTS) $(reader1_LDADD) $(LIBS)
-
-reader2$(EXEEXT): $(reader2_OBJECTS) $(reader2_DEPENDENCIES) $(EXTRA_reader2_DEPENDENCIES) 
-	@rm -f reader2$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(reader2_OBJECTS) $(reader2_LDADD) $(LIBS)
-
-reader3$(EXEEXT): $(reader3_OBJECTS) $(reader3_DEPENDENCIES) $(EXTRA_reader3_DEPENDENCIES) 
-	@rm -f reader3$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(reader3_OBJECTS) $(reader3_LDADD) $(LIBS)
-
-reader4$(EXEEXT): $(reader4_OBJECTS) $(reader4_DEPENDENCIES) $(EXTRA_reader4_DEPENDENCIES) 
-	@rm -f reader4$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(reader4_OBJECTS) $(reader4_LDADD) $(LIBS)
-
-testWriter$(EXEEXT): $(testWriter_OBJECTS) $(testWriter_DEPENDENCIES) $(EXTRA_testWriter_DEPENDENCIES) 
-	@rm -f testWriter$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(testWriter_OBJECTS) $(testWriter_LDADD) $(LIBS)
-
-tree1$(EXEEXT): $(tree1_OBJECTS) $(tree1_DEPENDENCIES) $(EXTRA_tree1_DEPENDENCIES) 
-	@rm -f tree1$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(tree1_OBJECTS) $(tree1_LDADD) $(LIBS)
-
-tree2$(EXEEXT): $(tree2_OBJECTS) $(tree2_DEPENDENCIES) $(EXTRA_tree2_DEPENDENCIES) 
-	@rm -f tree2$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(tree2_OBJECTS) $(tree2_LDADD) $(LIBS)
-
-xpath1$(EXEEXT): $(xpath1_OBJECTS) $(xpath1_DEPENDENCIES) $(EXTRA_xpath1_DEPENDENCIES) 
-	@rm -f xpath1$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(xpath1_OBJECTS) $(xpath1_LDADD) $(LIBS)
-
-xpath2$(EXEEXT): $(xpath2_OBJECTS) $(xpath2_DEPENDENCIES) $(EXTRA_xpath2_DEPENDENCIES) 
-	@rm -f xpath2$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(xpath2_OBJECTS) $(xpath2_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include ./$(DEPDIR)/io1.Po # am--include-marker
-include ./$(DEPDIR)/io2.Po # am--include-marker
-include ./$(DEPDIR)/parse1.Po # am--include-marker
-include ./$(DEPDIR)/parse2.Po # am--include-marker
-include ./$(DEPDIR)/parse3.Po # am--include-marker
-include ./$(DEPDIR)/parse4.Po # am--include-marker
-include ./$(DEPDIR)/reader1.Po # am--include-marker
-include ./$(DEPDIR)/reader2.Po # am--include-marker
-include ./$(DEPDIR)/reader3.Po # am--include-marker
-include ./$(DEPDIR)/reader4.Po # am--include-marker
-include ./$(DEPDIR)/testWriter.Po # am--include-marker
-include ./$(DEPDIR)/tree1.Po # am--include-marker
-include ./$(DEPDIR)/tree2.Po # am--include-marker
-include ./$(DEPDIR)/xpath1.Po # am--include-marker
-include ./$(DEPDIR)/xpath2.Po # am--include-marker
-
-$(am__depfiles_remade):
-	@$(MKDIR_P) $(@D)
-	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
-
-am--depfiles: $(am__depfiles_remade)
-
-.c.o:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-#	$(AM_V_CC)source='$<' object='$@' libtool=yes \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
-	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
-	mostlyclean-am
-
-distclean: distclean-am
-		-rm -f ./$(DEPDIR)/io1.Po
-	-rm -f ./$(DEPDIR)/io2.Po
-	-rm -f ./$(DEPDIR)/parse1.Po
-	-rm -f ./$(DEPDIR)/parse2.Po
-	-rm -f ./$(DEPDIR)/parse3.Po
-	-rm -f ./$(DEPDIR)/parse4.Po
-	-rm -f ./$(DEPDIR)/reader1.Po
-	-rm -f ./$(DEPDIR)/reader2.Po
-	-rm -f ./$(DEPDIR)/reader3.Po
-	-rm -f ./$(DEPDIR)/reader4.Po
-	-rm -f ./$(DEPDIR)/testWriter.Po
-	-rm -f ./$(DEPDIR)/tree1.Po
-	-rm -f ./$(DEPDIR)/tree2.Po
-	-rm -f ./$(DEPDIR)/xpath1.Po
-	-rm -f ./$(DEPDIR)/xpath2.Po
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-data-local
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-		-rm -f ./$(DEPDIR)/io1.Po
-	-rm -f ./$(DEPDIR)/io2.Po
-	-rm -f ./$(DEPDIR)/parse1.Po
-	-rm -f ./$(DEPDIR)/parse2.Po
-	-rm -f ./$(DEPDIR)/parse3.Po
-	-rm -f ./$(DEPDIR)/parse4.Po
-	-rm -f ./$(DEPDIR)/reader1.Po
-	-rm -f ./$(DEPDIR)/reader2.Po
-	-rm -f ./$(DEPDIR)/reader3.Po
-	-rm -f ./$(DEPDIR)/reader4.Po
-	-rm -f ./$(DEPDIR)/testWriter.Po
-	-rm -f ./$(DEPDIR)/tree1.Po
-	-rm -f ./$(DEPDIR)/tree2.Po
-	-rm -f ./$(DEPDIR)/xpath1.Po
-	-rm -f ./$(DEPDIR)/xpath2.Po
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-local
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
-	check-local clean clean-checkPROGRAMS clean-generic \
-	clean-libtool clean-local cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-data-local install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am uninstall-local
-
-.PRECIOUS: Makefile
-
-
-rebuild:
-	cd $(srcdir) && $(PYTHON) index.py
-	$(MAKE) Makefile
-	cd $(srcdir) && xsltproc examples.xsl examples.xml
-	-cd $(srcdir) && xmllint --valid --noout index.html
-
-.PHONY: rebuild
-
-install-data-local: 
-	$(MKDIR_P) $(DESTDIR)$(docdir)/examples
-	-$(INSTALL) -m 0644 $(srcdir)/*.html $(srcdir)/*.c $(DESTDIR)$(docdir)/examples/
-
-uninstall-local:
-	rm -f $(DESTDIR)$(docdir)/examples/*.c
-	rm -f $(DESTDIR)$(docdir)/examples/*.html
-	-rmdir $(DESTDIR)$(docdir)/examples
-
-clean-local:
-	test -f Makefile.am || rm -f test?.xml
-	rm -f .memdump
-
-valgrind: 
-	$(MAKE) CHECKER='valgrind' check
-
-check-local:
-	@test -f Makefile.am || test -f test1.xml || $(LN_S) $(srcdir)/test?.xml .
-	@(echo '## examples regression tests')
-	@(echo > .memdump)
-	@$(CHECKER) ./io1 >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./io2 >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./parse1 test1.xml
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./parse2 test2.xml
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./parse3
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./parse4 test3.xml
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./reader1 test2.xml >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./reader2 test2.xml >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./reader3 >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./reader4 test1.xml test2.xml test3.xml >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./testWriter
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./tree1 test2.xml >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./tree2 >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./xpath1 test3.xml '//child2' >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@$(CHECKER) ./xpath2 test3.xml '//discarded' discarded >/dev/null
-	@grep "MORY ALLO" .memdump | grep -v "MEMORY ALLOCATED : 0" ; exit 0
-	@rm -f *.tmp
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/example/.deps/gjobread.Po b/third_party/libxml/linux/example/.deps/gjobread.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/example/.deps/gjobread.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/example/Makefile b/third_party/libxml/linux/example/Makefile
deleted file mode 100644
index 64704cce..0000000
--- a/third_party/libxml/linux/example/Makefile
+++ /dev/null
@@ -1,679 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# example/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-check_PROGRAMS = gjobread$(EXEEXT)
-subdir = example
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am_gjobread_OBJECTS = gjobread.$(OBJEXT)
-gjobread_OBJECTS = $(am_gjobread_OBJECTS)
-gjobread_LDADD = $(LDADD)
-gjobread_DEPENDENCIES = $(top_builddir)/libxml2.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-am__v_lt_1 = 
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/gjobread.Po
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(gjobread_SOURCES)
-DIST_SOURCES = $(gjobread_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/example
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/example
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../
-top_builddir = ..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include
-LDADD = $(top_builddir)/libxml2.la
-gjobread_SOURCES = gjobread.c
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign example/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign example/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-checkPROGRAMS:
-	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-gjobread$(EXEEXT): $(gjobread_OBJECTS) $(gjobread_DEPENDENCIES) $(EXTRA_gjobread_DEPENDENCIES) 
-	@rm -f gjobread$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(gjobread_OBJECTS) $(gjobread_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include ./$(DEPDIR)/gjobread.Po # am--include-marker
-
-$(am__depfiles_remade):
-	@$(MKDIR_P) $(@D)
-	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
-
-am--depfiles: $(am__depfiles_remade)
-
-.c.o:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-#	$(AM_V_CC)source='$<' object='$@' libtool=yes \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-am
-		-rm -f ./$(DEPDIR)/gjobread.Po
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-		-rm -f ./$(DEPDIR)/gjobread.Po
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
-	clean-checkPROGRAMS clean-generic clean-libtool cscopelist-am \
-	ctags ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/fuzz/.deps/fuzz.Po b/third_party/libxml/linux/fuzz/.deps/fuzz.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/fuzz.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/genSeed.Po b/third_party/libxml/linux/fuzz/.deps/genSeed.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/genSeed.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/html.Po b/third_party/libxml/linux/fuzz/.deps/html.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/html.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/regexp.Po b/third_party/libxml/linux/fuzz/.deps/regexp.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/regexp.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/schema.Po b/third_party/libxml/linux/fuzz/.deps/schema.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/schema.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po b/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/testFuzzer.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/uri.Po b/third_party/libxml/linux/fuzz/.deps/uri.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/uri.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xinclude.Po b/third_party/libxml/linux/fuzz/.deps/xinclude.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/xinclude.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xml.Po b/third_party/libxml/linux/fuzz/.deps/xml.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/xml.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/.deps/xpath.Po b/third_party/libxml/linux/fuzz/.deps/xpath.Po
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/fuzz/.deps/xpath.Po
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/fuzz/Makefile b/third_party/libxml/linux/fuzz/Makefile
deleted file mode 100644
index 1a2b430..0000000
--- a/third_party/libxml/linux/fuzz/Makefile
+++ /dev/null
@@ -1,959 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# fuzz/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-EXTRA_PROGRAMS = genSeed$(EXEEXT) html$(EXEEXT) regexp$(EXEEXT) \
-	schema$(EXEEXT) uri$(EXEEXT) xinclude$(EXEEXT) xml$(EXEEXT) \
-	xpath$(EXEEXT)
-check_PROGRAMS = testFuzzer$(EXEEXT)
-subdir = fuzz
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-am_genSeed_OBJECTS = genSeed.$(OBJEXT) fuzz.$(OBJEXT)
-genSeed_OBJECTS = $(am_genSeed_OBJECTS)
-genSeed_LDADD = $(LDADD)
-genSeed_DEPENDENCIES = $(top_builddir)/libxml2.la
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-am__v_lt_1 = 
-am_html_OBJECTS = html.$(OBJEXT) fuzz.$(OBJEXT)
-html_OBJECTS = $(am_html_OBJECTS)
-html_LDADD = $(LDADD)
-html_DEPENDENCIES = $(top_builddir)/libxml2.la
-html_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(html_LDFLAGS) $(LDFLAGS) -o $@
-am_regexp_OBJECTS = regexp.$(OBJEXT) fuzz.$(OBJEXT)
-regexp_OBJECTS = $(am_regexp_OBJECTS)
-regexp_LDADD = $(LDADD)
-regexp_DEPENDENCIES = $(top_builddir)/libxml2.la
-regexp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(regexp_LDFLAGS) $(LDFLAGS) -o $@
-am_schema_OBJECTS = schema.$(OBJEXT) fuzz.$(OBJEXT)
-schema_OBJECTS = $(am_schema_OBJECTS)
-schema_LDADD = $(LDADD)
-schema_DEPENDENCIES = $(top_builddir)/libxml2.la
-schema_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(schema_LDFLAGS) $(LDFLAGS) -o $@
-am_testFuzzer_OBJECTS = testFuzzer.$(OBJEXT) fuzz.$(OBJEXT)
-testFuzzer_OBJECTS = $(am_testFuzzer_OBJECTS)
-testFuzzer_LDADD = $(LDADD)
-testFuzzer_DEPENDENCIES = $(top_builddir)/libxml2.la
-am_uri_OBJECTS = uri.$(OBJEXT) fuzz.$(OBJEXT)
-uri_OBJECTS = $(am_uri_OBJECTS)
-uri_LDADD = $(LDADD)
-uri_DEPENDENCIES = $(top_builddir)/libxml2.la
-uri_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(uri_LDFLAGS) $(LDFLAGS) -o $@
-am_xinclude_OBJECTS = xinclude.$(OBJEXT) fuzz.$(OBJEXT)
-xinclude_OBJECTS = $(am_xinclude_OBJECTS)
-xinclude_LDADD = $(LDADD)
-xinclude_DEPENDENCIES = $(top_builddir)/libxml2.la
-xinclude_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(xinclude_LDFLAGS) $(LDFLAGS) -o $@
-am_xml_OBJECTS = xml.$(OBJEXT) fuzz.$(OBJEXT)
-xml_OBJECTS = $(am_xml_OBJECTS)
-xml_LDADD = $(LDADD)
-xml_DEPENDENCIES = $(top_builddir)/libxml2.la
-xml_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(xml_LDFLAGS) $(LDFLAGS) -o $@
-am_xpath_OBJECTS = xpath.$(OBJEXT) fuzz.$(OBJEXT)
-xpath_OBJECTS = $(am_xpath_OBJECTS)
-xpath_LDADD = $(LDADD)
-xpath_DEPENDENCIES = $(top_builddir)/libxml2.la
-xpath_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(xpath_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__maybe_remake_depfiles = depfiles
-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)/xpath.Po
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \
-	$(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_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)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/fuzz
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/fuzz
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../
-top_builddir = ..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-AUTOMAKE_OPTIONS = -Wno-syntax
-EXTRA_DIST = html.dict regexp.dict schema.dict xml.dict xpath.dict \
-	     static_seed/uri static_seed/regexp fuzz.h
-
-CLEANFILES = $(EXTRA_PROGRAMS)
-AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
-DEPENDENCIES = $(top_builddir)/libxml2.la
-LDADD = $(top_builddir)/libxml2.la
-XML_MAX_LEN = 80000
-# Single quotes to avoid wildcard expansion by the shell
-XML_SEED_CORPUS_SRC = \
-    '$(top_srcdir)/test/*' \
-    '$(top_srcdir)/test/errors/*.xml' \
-    '$(top_srcdir)/test/errors10/*.xml' \
-    '$(top_srcdir)/test/namespaces/*' \
-    '$(top_srcdir)/test/recurse/*.xml' \
-    '$(top_srcdir)/test/SVG/*.xml' \
-    '$(top_srcdir)/test/valid/*.xml' \
-    '$(top_srcdir)/test/VC/*' \
-    '$(top_srcdir)/test/VCM/*' \
-    '$(top_srcdir)/test/xmlid/*'
-
-testFuzzer_SOURCES = testFuzzer.c fuzz.c
-
-# Seed corpus
-genSeed_SOURCES = genSeed.c fuzz.c
-xml_SOURCES = xml.c fuzz.c
-xml_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-xinclude_SOURCES = xinclude.c fuzz.c
-xinclude_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-html_SOURCES = html.c fuzz.c
-html_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-regexp_SOURCES = regexp.c fuzz.c
-regexp_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-uri_SOURCES = uri.c fuzz.c
-uri_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-schema_SOURCES = schema.c fuzz.c
-schema_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-xpath_SOURCES = xpath.c fuzz.c
-xpath_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fuzz/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign fuzz/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-checkPROGRAMS:
-	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
-	echo " rm -f" $$list; \
-	rm -f $$list || exit $$?; \
-	test -n "$(EXEEXT)" || exit 0; \
-	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
-	echo " rm -f" $$list; \
-	rm -f $$list
-
-genSeed$(EXEEXT): $(genSeed_OBJECTS) $(genSeed_DEPENDENCIES) $(EXTRA_genSeed_DEPENDENCIES) 
-	@rm -f genSeed$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(genSeed_OBJECTS) $(genSeed_LDADD) $(LIBS)
-
-html$(EXEEXT): $(html_OBJECTS) $(html_DEPENDENCIES) $(EXTRA_html_DEPENDENCIES) 
-	@rm -f html$(EXEEXT)
-	$(AM_V_CCLD)$(html_LINK) $(html_OBJECTS) $(html_LDADD) $(LIBS)
-
-regexp$(EXEEXT): $(regexp_OBJECTS) $(regexp_DEPENDENCIES) $(EXTRA_regexp_DEPENDENCIES) 
-	@rm -f regexp$(EXEEXT)
-	$(AM_V_CCLD)$(regexp_LINK) $(regexp_OBJECTS) $(regexp_LDADD) $(LIBS)
-
-schema$(EXEEXT): $(schema_OBJECTS) $(schema_DEPENDENCIES) $(EXTRA_schema_DEPENDENCIES) 
-	@rm -f schema$(EXEEXT)
-	$(AM_V_CCLD)$(schema_LINK) $(schema_OBJECTS) $(schema_LDADD) $(LIBS)
-
-testFuzzer$(EXEEXT): $(testFuzzer_OBJECTS) $(testFuzzer_DEPENDENCIES) $(EXTRA_testFuzzer_DEPENDENCIES) 
-	@rm -f testFuzzer$(EXEEXT)
-	$(AM_V_CCLD)$(LINK) $(testFuzzer_OBJECTS) $(testFuzzer_LDADD) $(LIBS)
-
-uri$(EXEEXT): $(uri_OBJECTS) $(uri_DEPENDENCIES) $(EXTRA_uri_DEPENDENCIES) 
-	@rm -f uri$(EXEEXT)
-	$(AM_V_CCLD)$(uri_LINK) $(uri_OBJECTS) $(uri_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)
-
-xml$(EXEEXT): $(xml_OBJECTS) $(xml_DEPENDENCIES) $(EXTRA_xml_DEPENDENCIES) 
-	@rm -f xml$(EXEEXT)
-	$(AM_V_CCLD)$(xml_LINK) $(xml_OBJECTS) $(xml_LDADD) $(LIBS)
-
-xpath$(EXEEXT): $(xpath_OBJECTS) $(xpath_DEPENDENCIES) $(EXTRA_xpath_DEPENDENCIES) 
-	@rm -f xpath$(EXEEXT)
-	$(AM_V_CCLD)$(xpath_LINK) $(xpath_OBJECTS) $(xpath_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include ./$(DEPDIR)/fuzz.Po # am--include-marker
-include ./$(DEPDIR)/genSeed.Po # am--include-marker
-include ./$(DEPDIR)/html.Po # am--include-marker
-include ./$(DEPDIR)/regexp.Po # am--include-marker
-include ./$(DEPDIR)/schema.Po # am--include-marker
-include ./$(DEPDIR)/testFuzzer.Po # am--include-marker
-include ./$(DEPDIR)/uri.Po # am--include-marker
-include ./$(DEPDIR)/xinclude.Po # am--include-marker
-include ./$(DEPDIR)/xml.Po # am--include-marker
-include ./$(DEPDIR)/xpath.Po # am--include-marker
-
-$(am__depfiles_remade):
-	@$(MKDIR_P) $(@D)
-	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
-
-am--depfiles: $(am__depfiles_remade)
-
-.c.o:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-#	$(AM_V_CC)source='$<' object='$@' libtool=yes \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
-	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
-	mostlyclean-am
-
-distclean: distclean-am
-		-rm -f ./$(DEPDIR)/fuzz.Po
-	-rm -f ./$(DEPDIR)/genSeed.Po
-	-rm -f ./$(DEPDIR)/html.Po
-	-rm -f ./$(DEPDIR)/regexp.Po
-	-rm -f ./$(DEPDIR)/schema.Po
-	-rm -f ./$(DEPDIR)/testFuzzer.Po
-	-rm -f ./$(DEPDIR)/uri.Po
-	-rm -f ./$(DEPDIR)/xinclude.Po
-	-rm -f ./$(DEPDIR)/xml.Po
-	-rm -f ./$(DEPDIR)/xpath.Po
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-		-rm -f ./$(DEPDIR)/fuzz.Po
-	-rm -f ./$(DEPDIR)/genSeed.Po
-	-rm -f ./$(DEPDIR)/html.Po
-	-rm -f ./$(DEPDIR)/regexp.Po
-	-rm -f ./$(DEPDIR)/schema.Po
-	-rm -f ./$(DEPDIR)/testFuzzer.Po
-	-rm -f ./$(DEPDIR)/uri.Po
-	-rm -f ./$(DEPDIR)/xinclude.Po
-	-rm -f ./$(DEPDIR)/xml.Po
-	-rm -f ./$(DEPDIR)/xpath.Po
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am \
-	check-local clean clean-checkPROGRAMS clean-generic \
-	clean-libtool clean-local cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-.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
-
-check-local: corpus
-	./testFuzzer$(EXEEXT)
-
-clean-corpus:
-	rm -rf seed
-
-clean-local: clean-corpus
-
-# XML fuzzer
-
-seed/xml.stamp: genSeed$(EXEEXT)
-	@mkdir -p seed/xml
-	./genSeed$(EXEEXT) xml $(XML_SEED_CORPUS_SRC)
-	@touch seed/xml.stamp
-
-fuzz-xml: xml$(EXEEXT) seed/xml.stamp
-	@mkdir -p corpus/xml
-	./xml$(EXEEXT) \
-	    -dict=xml.dict \
-	    -max_len=$(XML_MAX_LEN) \
-	    -timeout=20 \
-	    corpus/xml seed/xml
-
-# XInclude fuzzer
-
-seed/xinclude.stamp: genSeed$(EXEEXT)
-	@mkdir -p seed/xinclude
-	./genSeed$(EXEEXT) xinclude \
-	    '$(top_srcdir)/test/XInclude/docs/*' \
-	    '$(top_srcdir)/test/XInclude/without-reader/*'
-	@touch seed/xinclude.stamp
-
-fuzz-xinclude: xinclude$(EXEEXT) seed/xinclude.stamp
-	@mkdir -p corpus/xinclude
-	./xinclude$(EXEEXT) \
-	    -dict=xml.dict \
-	    -max_len=$(XML_MAX_LEN) \
-	    -timeout=20 \
-	    corpus/xinclude seed/xinclude
-
-# HTML fuzzer
-
-seed/html.stamp: genSeed$(EXEEXT)
-	@mkdir -p seed/html
-	./genSeed$(EXEEXT) html '$(top_srcdir)/test/HTML/*'
-	@touch seed/html.stamp
-
-fuzz-html: html$(EXEEXT) seed/html.stamp
-	@mkdir -p corpus/html
-	./html$(EXEEXT) \
-	    -dict=html.dict \
-	    -max_len=1000000 \
-	    -timeout=10 \
-	    corpus/html seed/html
-
-# Regexp fuzzer
-
-seed/regexp.stamp:
-	@mkdir -p seed/regexp
-	cp -r $(srcdir)/static_seed/regexp seed
-	@touch seed/regexp.stamp
-
-fuzz-regexp: regexp$(EXEEXT)
-	@mkdir -p corpus/regexp
-	./regexp$(EXEEXT) \
-	    -dict=regexp.dict \
-	    -max_len=200 \
-	    -timeout=5 \
-	    corpus/regexp seed/regexp
-
-# URI fuzzer
-
-seed/uri.stamp:
-	@mkdir -p seed/uri
-	cp -r $(srcdir)/static_seed/uri seed
-	@touch seed/uri.stamp
-
-fuzz-uri: uri$(EXEEXT)
-	@mkdir -p corpus/uri
-	./uri$(EXEEXT) \
-	    -max_len=10000 \
-	    -timeout=2 \
-	    corpus/uri seed/uri
-
-# XML Schema fuzzer
-
-seed/schema.stamp: genSeed$(EXEEXT)
-	@mkdir -p seed/schema
-	./genSeed$(EXEEXT) schema '$(top_srcdir)/test/schemas/*.xsd'
-	@touch seed/schema.stamp
-
-fuzz-schema: schema$(EXEEXT) seed/schema.stamp
-	@mkdir -p corpus/schema
-	./schema$(EXEEXT) \
-	    -dict=schema.dict \
-	    -max_len=$(XML_MAX_LEN) \
-	    -timeout=20 \
-	    corpus/schema seed/schema
-
-# XPath fuzzer
-
-seed/xpath.stamp: genSeed$(EXEEXT)
-	@mkdir -p seed/xpath
-	./genSeed$(EXEEXT) xpath '$(top_srcdir)/test/XPath'
-	@touch seed/xpath.stamp
-
-fuzz-xpath: xpath$(EXEEXT) seed/xpath.stamp
-	@mkdir -p corpus/xpath
-	./xpath$(EXEEXT) \
-	    -dict=xpath.dict \
-	    -max_len=10000 \
-	    -timeout=20 \
-	    corpus/xpath seed/xpath
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/include/private/Makefile b/third_party/libxml/linux/include/private/Makefile
index f510bae4..c70ffa7d 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 = Wed Feb 22 2023
+RELDATE = Fri Feb 24 2023
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/sh
diff --git a/third_party/libxml/linux/python/.deps/libxml.Plo b/third_party/libxml/linux/python/.deps/libxml.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/python/.deps/libxml.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/python/.deps/libxml2-py.Plo b/third_party/libxml/linux/python/.deps/libxml2-py.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/python/.deps/libxml2-py.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/python/.deps/types.Plo b/third_party/libxml/linux/python/.deps/types.Plo
deleted file mode 100644
index 9ce06a8..0000000
--- a/third_party/libxml/linux/python/.deps/types.Plo
+++ /dev/null
@@ -1 +0,0 @@
-# dummy
diff --git a/third_party/libxml/linux/python/Makefile b/third_party/libxml/linux/python/Makefile
deleted file mode 100644
index e8a0aa0..0000000
--- a/third_party/libxml/linux/python/Makefile
+++ /dev/null
@@ -1,1015 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# python/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-# Makefile for libxml2 python library
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-subdir = python
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__python_PYTHON_DIST) \
-	$(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = setup.py
-CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)" \
-	"$(DESTDIR)$(pythondir)"
-LTLIBRARIES = $(pyexec_LTLIBRARIES)
-am__DEPENDENCIES_1 =
-libxml2mod_la_DEPENDENCIES =  \
-	$(top_builddir)/libxml2.la \
-	$(am__DEPENDENCIES_1)
-am__libxml2mod_la_SOURCES_DIST = libxml.c libxml_wrap.h types.c
-am_libxml2mod_la_OBJECTS = libxml.lo types.lo
-nodist_libxml2mod_la_OBJECTS = libxml2-py.lo
-libxml2mod_la_OBJECTS = $(am_libxml2mod_la_OBJECTS) \
-	$(nodist_libxml2mod_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
-am__v_lt_0 = --silent
-am__v_lt_1 = 
-libxml2mod_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libxml2mod_la_LDFLAGS) $(LDFLAGS) -o $@
-am_libxml2mod_la_rpath = -rpath $(pyexecdir)
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = ./$(DEPDIR)/libxml.Plo \
-	./$(DEPDIR)/libxml2-py.Plo ./$(DEPDIR)/types.Plo
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(libxml2mod_la_SOURCES) $(nodist_libxml2mod_la_SOURCES)
-DIST_SOURCES = $(am__libxml2mod_la_SOURCES_DIST)
-RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
-	ctags-recursive dvi-recursive html-recursive info-recursive \
-	install-data-recursive install-dvi-recursive \
-	install-exec-recursive install-html-recursive \
-	install-info-recursive install-pdf-recursive \
-	install-ps-recursive install-recursive installcheck-recursive \
-	installdirs-recursive pdf-recursive ps-recursive \
-	tags-recursive uninstall-recursive
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile)
-am__pep3147_tweak = \
-  sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.pyc __pycache__/&.*.pyo|'
-am__python_PYTHON_DIST = drv_libxml2.py
-py_compile = $(top_srcdir)/py-compile
-RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
-  distclean-recursive maintainer-clean-recursive
-am__recursive_targets = \
-  $(RECURSIVE_TARGETS) \
-  $(RECURSIVE_CLEAN_TARGETS) \
-  $(am__extra_recursive_targets)
-AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-	distdir distdir-am
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-DIST_SUBDIRS = $(SUBDIRS)
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/setup.py.in \
-	$(top_srcdir)/depcomp $(top_srcdir)/py-compile README
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-am__relativize = \
-  dir0=`pwd`; \
-  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
-  sed_rest='s,^[^/]*/*,,'; \
-  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
-  sed_butlast='s,/*[^/]*$$,,'; \
-  while test -n "$$dir1"; do \
-    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
-    if test "$$first" != "."; then \
-      if test "$$first" = ".."; then \
-        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
-        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
-      else \
-        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
-        if test "$$first2" = "$$first"; then \
-          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
-        else \
-          dir2="../$$dir2"; \
-        fi; \
-        dir0="$$dir0"/"$$first"; \
-      fi; \
-    fi; \
-    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
-  done; \
-  reldir="$$dir2"
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/python
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../
-top_builddir = ..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-SUBDIRS = . tests
-EXTRA_DIST = \
-	generator.py		\
-	libxml.py		\
-	libxml2-python-api.xml
-
-AM_CPPFLAGS = \
-	-I$(top_builddir)/include \
-	-I$(top_srcdir)/include	\
-	$(PYTHON_CFLAGS)
-
-pyexec_LTLIBRARIES = libxml2mod.la
-libxml2mod_la_SOURCES = libxml.c libxml_wrap.h types.c
-nodist_libxml2mod_la_SOURCES = libxml2-py.h libxml2-py.c
-libxml2mod_la_LDFLAGS = $(AM_LDFLAGS) $(PYTHON_LDFLAGS) -module -avoid-version
-libxml2mod_la_LIBADD = $(top_builddir)/libxml2.la $(PYTHON_LIBS)
-BUILT_SOURCES = libxml2-export.c libxml2-py.h libxml2-py.c
-python_PYTHON = drv_libxml2.py
-nodist_python_PYTHON = libxml2.py
-API_DESC = $(top_srcdir)/doc/libxml2-api.xml $(srcdir)/libxml2-python-api.xml
-GENERATED = libxml2class.py libxml2class.txt $(BUILT_SOURCES)
-CLEANFILES = libxml2.py $(GENERATED)
-all: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign python/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-setup.py: $(top_builddir)/config.status $(srcdir)/setup.py.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-install-pyexecLTLIBRARIES: $(pyexec_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pyexecdir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pyexecdir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pyexecdir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pyexecdir)"; \
-	}
-
-uninstall-pyexecLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pyexecdir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pyexecdir)/$$f"; \
-	done
-
-clean-pyexecLTLIBRARIES:
-	-test -z "$(pyexec_LTLIBRARIES)" || rm -f $(pyexec_LTLIBRARIES)
-	@list='$(pyexec_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
-
-libxml2mod.la: $(libxml2mod_la_OBJECTS) $(libxml2mod_la_DEPENDENCIES) $(EXTRA_libxml2mod_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libxml2mod_la_LINK) $(am_libxml2mod_la_rpath) $(libxml2mod_la_OBJECTS) $(libxml2mod_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-include ./$(DEPDIR)/libxml.Plo # am--include-marker
-include ./$(DEPDIR)/libxml2-py.Plo # am--include-marker
-include ./$(DEPDIR)/types.Plo # am--include-marker
-
-$(am__depfiles_remade):
-	@$(MKDIR_P) $(@D)
-	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
-
-am--depfiles: $(am__depfiles_remade)
-
-.c.o:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-#	$(AM_V_CC)source='$<' object='$@' libtool=no \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-#	$(AM_V_CC)source='$<' object='$@' libtool=yes \
-#	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
-#	$(AM_V_CC_no)$(LTCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-nodist_pythonPYTHON: $(nodist_python_PYTHON)
-	@$(NORMAL_INSTALL)
-	@list='$(nodist_python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
-	  if test -f $$b$$p; then \
-	    $(am__strip_dir) \
-	    dlist="$$dlist $$f"; \
-	    list2="$$list2 $$b$$p"; \
-	  else :; fi; \
-	done; \
-	for file in $$list2; do echo $$file; done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \
-	done || exit $$?; \
-	if test -n "$$dlist"; then \
-	  $(am__py_compile) --destdir "$(DESTDIR)" \
-	                    --basedir "$(pythondir)" $$dlist; \
-	else :; fi
-
-uninstall-nodist_pythonPYTHON:
-	@$(NORMAL_UNINSTALL)
-	@list='$(nodist_python_PYTHON)'; test -n "$(pythondir)" || list=; \
-	py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$py_files" || exit 0; \
-	dir='$(DESTDIR)$(pythondir)'; \
-	pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \
-	pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \
-	st=0; \
-	for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \
-	  $(am__uninstall_files_from_dir) || st=$$?; \
-	done; \
-	dir='$(DESTDIR)$(pythondir)'; \
-	echo "$$py_files" | $(am__pep3147_tweak) | $(am__base_list) | \
-	  while read files; do \
-	    $(am__uninstall_files_from_dir) || st=$$?; \
-	  done || exit $$?; \
-	exit $$st
-install-pythonPYTHON: $(python_PYTHON)
-	@$(NORMAL_INSTALL)
-	@list='$(python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
-	  if test -f $$b$$p; then \
-	    $(am__strip_dir) \
-	    dlist="$$dlist $$f"; \
-	    list2="$$list2 $$b$$p"; \
-	  else :; fi; \
-	done; \
-	for file in $$list2; do echo $$file; done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \
-	done || exit $$?; \
-	if test -n "$$dlist"; then \
-	  $(am__py_compile) --destdir "$(DESTDIR)" \
-	                    --basedir "$(pythondir)" $$dlist; \
-	else :; fi
-
-uninstall-pythonPYTHON:
-	@$(NORMAL_UNINSTALL)
-	@list='$(python_PYTHON)'; test -n "$(pythondir)" || list=; \
-	py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	test -n "$$py_files" || exit 0; \
-	dir='$(DESTDIR)$(pythondir)'; \
-	pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \
-	pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \
-	st=0; \
-	for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \
-	  $(am__uninstall_files_from_dir) || st=$$?; \
-	done; \
-	dir='$(DESTDIR)$(pythondir)'; \
-	echo "$$py_files" | $(am__pep3147_tweak) | $(am__base_list) | \
-	  while read files; do \
-	    $(am__uninstall_files_from_dir) || st=$$?; \
-	  done || exit $$?; \
-	exit $$st
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run 'make' without going through this Makefile.
-# To change the values of 'make' variables: instead of editing Makefiles,
-# (1) if the variable is set in 'config.status', edit 'config.status'
-#     (which will cause the Makefiles to be regenerated when you run 'make');
-# (2) otherwise, pass the desired values on the 'make' command line.
-$(am__recursive_targets):
-	@fail=; \
-	if $(am__make_keepgoing); then \
-	  failcom='fail=yes'; \
-	else \
-	  failcom='exit 1'; \
-	fi; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-ID: $(am__tagged_files)
-	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-recursive
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	set x; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	$(am__define_uniq_tagged_files); \
-	shift; \
-	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  if test $$# -gt 0; then \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      "$$@" $$unique; \
-	  else \
-	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	      $$unique; \
-	  fi; \
-	fi
-ctags: ctags-recursive
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-	$(am__define_uniq_tagged_files); \
-	test -z "$(CTAGS_ARGS)$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && $(am__cd) $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-recursive
-
-cscopelist-am: $(am__tagged_files)
-	list='$(am__tagged_files)'; \
-	case "$(srcdir)" in \
-	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-	  *) sdir=$(subdir)/$(srcdir) ;; \
-	esac; \
-	for i in $$list; do \
-	  if test -f "$$i"; then \
-	    echo "$(subdir)/$$i"; \
-	  else \
-	    echo "$$sdir/$$i"; \
-	  fi; \
-	done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    $(am__make_dryrun) \
-	      || test -d "$(distdir)/$$subdir" \
-	      || $(MKDIR_P) "$(distdir)/$$subdir" \
-	      || exit 1; \
-	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
-	    $(am__relativize); \
-	    new_distdir=$$reldir; \
-	    dir1=$$subdir; dir2="$(top_distdir)"; \
-	    $(am__relativize); \
-	    new_top_distdir=$$reldir; \
-	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
-	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
-	    ($(am__cd) $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$new_top_distdir" \
-	        distdir="$$new_distdir" \
-		am__remove_distdir=: \
-		am__skip_length_check=: \
-		am__skip_mode_fix=: \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) check-recursive
-#all-local:
-all-am: Makefile $(LTLIBRARIES) all-local
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)" "$(DESTDIR)$(pythondir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-recursive
-install-exec: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-#clean-local:
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool clean-local \
-	clean-pyexecLTLIBRARIES mostlyclean-am
-
-distclean: distclean-recursive
-		-rm -f ./$(DEPDIR)/libxml.Plo
-	-rm -f ./$(DEPDIR)/libxml2-py.Plo
-	-rm -f ./$(DEPDIR)/types.Plo
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-html-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-nodist_pythonPYTHON install-pythonPYTHON
-
-install-dvi: install-dvi-recursive
-
-install-dvi-am:
-
-install-exec-am: install-pyexecLTLIBRARIES
-
-install-html: install-html-recursive
-
-install-html-am:
-
-install-info: install-info-recursive
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-recursive
-
-install-pdf-am:
-
-install-ps: install-ps-recursive
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-		-rm -f ./$(DEPDIR)/libxml.Plo
-	-rm -f ./$(DEPDIR)/libxml2-py.Plo
-	-rm -f ./$(DEPDIR)/types.Plo
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-nodist_pythonPYTHON \
-	uninstall-pyexecLTLIBRARIES uninstall-pythonPYTHON
-
-.MAKE: $(am__recursive_targets) all check install install-am \
-	install-exec install-strip
-
-.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
-	am--depfiles check check-am clean clean-generic clean-libtool \
-	clean-local clean-pyexecLTLIBRARIES cscopelist-am ctags \
-	ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dvi install-dvi-am install-exec \
-	install-exec-am install-html install-html-am install-info \
-	install-info-am install-man install-nodist_pythonPYTHON \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-pyexecLTLIBRARIES install-pythonPYTHON install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
-	uninstall-nodist_pythonPYTHON uninstall-pyexecLTLIBRARIES \
-	uninstall-pythonPYTHON
-
-.PRECIOUS: Makefile
-
-
-# We use a rule with multiple output files which creates problems with
-# parallel builds.
-.NOTPARALLEL:
-
-all-local: libxml2.py
-
-$(GENERATED): $(srcdir)/generator.py $(API_DESC)
-	$(PYTHON) $(srcdir)/generator.py $(srcdir)
-
-# libxml.c #includes libxml2-export.c
-libxml.$(OBJEXT): libxml2-export.c
-
-libxml2.py: $(srcdir)/libxml.py libxml2class.py
-	cat $(srcdir)/libxml.py `test -f libxml2class.py || echo $(srcdir)/`libxml2class.py > $@
-
-clean-local:
-	rm -rf __pycache__ *.pyc
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/python/setup.py b/third_party/libxml/linux/python/setup.py
deleted file mode 100755
index 88800e15..0000000
--- a/third_party/libxml/linux/python/setup.py
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/env python3
-#
-# Setup script for libxml2 and libxslt if found
-#
-import sys, os
-
-try:
-    import setuptools
-except ImportError:
-    pass
-
-from distutils.core import setup, Extension
-
-# Below ROOT, we expect to find include, include/libxml2, lib and bin.
-# On *nix, it is not needed (but should not harm),
-# on Windows, it is set by configure.js.
-ROOT = r'/usr/local'
-
-# Thread-enabled libxml2
-with_threads = 1
-
-# Features of libxml2 requiring external DLLs
-with_iconv = 0
-with_zlib = 0
-with_lzma = 0
-with_icu = 1
-
-icu_series = 69
-
-if icu_series is not None:
-    icu_series_s = str(icu_series)
-else:
-    icu_series_s = ''
-
-# If bundling DLLs, check the following to ensure things are correct
-# (Check the value of `icu_series` above as well)
-iconv_dll = 'iconv.dll'
-zlib_dll = 'zlib1.dll'
-lzma_dll = 'liblzma.dll'
-icu_dlls = ['icuuc%s.dll' % icu_series_s, 'icudt%s.dll' % icu_series_s]
-
-# If this flag is set (windows only),
-# a private copy of the dlls are included in the package.
-# If this flag is not set, the libxml2 and libxslt
-# dlls must be found somewhere in the PATH at runtime.
-WITHDLLS = 1 and sys.platform.startswith('win')
-
-if WITHDLLS:
-    def altImport(s):
-        s = s.replace("import libxml2mod","from libxmlmods import libxml2mod")
-        return s
-
-def missing(file):
-    if os.access(file, os.R_OK) == 0:
-        return 1
-    return 0
-
-try:
-    HOME = os.environ['HOME']
-except:
-    HOME="C:"
-
-if sys.platform.startswith('win'):
-    libraryPrefix = 'lib'
-    platformLibs = []
-else:
-    libraryPrefix = ''
-    platformLibs = ["m","z"]
-
-# those are examined to find
-# - libxml2/libxml/tree.h
-# - libxslt/xsltconfig.h
-includes_dir = [
-"/usr/include",
-"/usr/local/include",
-"/opt/include",
-os.path.join(ROOT,'include'),
-HOME
-];
-
-xml_includes=""
-for dir in includes_dir:
-    if not missing(dir + "/libxml2/libxml/tree.h"):
-        xml_includes=dir + "/libxml2"
-        break;
-
-if xml_includes == "":
-    print("failed to find headers for libxml2: update includes_dir")
-    sys.exit(1)
-
-# those are added in the linker search path for libraries
-libdirs = [
-os.path.join(ROOT,'lib'),
-]
-
-xml_files = ["libxml2-api.xml", "libxml2-python-api.xml",
-             "libxml.c", "libxml.py", "libxml_wrap.h", "types.c",
-             "xmlgenerator.py", "README", "TODO", "drv_libxml2.py"]
-
-xslt_files = ["libxslt-api.xml", "libxslt-python-api.xml",
-             "libxslt.c", "libxsl.py", "libxslt_wrap.h",
-             "xsltgenerator.py"]
-
-if missing("libxml2-py.c") or missing("libxml2.py"):
-    try:
-        try:
-            import xmlgenerator
-        except:
-            import generator
-    except:
-        print("failed to find and generate stubs for libxml2, aborting ...")
-        print(sys.exc_info()[0], sys.exc_info()[1])
-        sys.exit(1)
-
-    head = open("libxml.py", "r")
-    generated = open("libxml2class.py", "r")
-    result = open("libxml2.py", "w")
-    for line in head.readlines():
-        if WITHDLLS:
-            result.write(altImport(line))
-        else:
-            result.write(line)
-    for line in generated.readlines():
-        result.write(line)
-    head.close()
-    generated.close()
-    result.close()
-
-with_xslt=0
-if missing("libxslt-py.c") or missing("libxslt.py"):
-    if missing("xsltgenerator.py") or missing("libxslt-api.xml"):
-        print("libxslt stub generator not found, libxslt not built")
-    else:
-        try:
-            import xsltgenerator
-        except:
-            print("failed to generate stubs for libxslt, aborting ...")
-            print(sys.exc_info()[0], sys.exc_info()[1])
-        else:
-            head = open("libxsl.py", "r")
-            generated = open("libxsltclass.py", "r")
-            result = open("libxslt.py", "w")
-            for line in head.readlines():
-                if WITHDLLS:
-                    result.write(altImport(line))
-                else:
-                    result.write(line)
-            for line in generated.readlines():
-                result.write(line)
-            head.close()
-            generated.close()
-            result.close()
-            with_xslt=1
-else:
-    with_xslt=1
-
-if with_xslt == 1:
-    xslt_includes=""
-    for dir in includes_dir:
-        if not missing(dir + "/libxslt/xsltconfig.h"):
-            xslt_includes=dir + "/libxslt"
-            break;
-
-    if xslt_includes == "":
-        print("failed to find headers for libxslt: update includes_dir")
-        with_xslt = 0
-
-if WITHDLLS:
-    # libxml dlls (expected in ROOT/bin)
-    dlls = [ 'libxml2.dll' ]
-
-    if with_zlib == 1:
-        dlls.append(zlib_dll)
-    if with_lzma == 1:
-        dlls.append(lzma_dll)
-    if with_iconv == 1:
-        dlls.append(iconv_dll)
-    if with_icu == 1:
-        dlls += icu_dlls
-    if with_xslt == 1:
-        dlls += ['libxslt.dll','libexslt.dll']
-
-    packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls]
-
-    # create __init__.py for the libxmlmods package
-    if not os.path.exists("libxmlmods"):
-        os.mkdir("libxmlmods")
-        open("libxmlmods/__init__.py","w").close()
-
-    packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls]
-
-descr = "libxml2 package"
-modules = [ 'libxml2', 'drv_libxml2' ]
-if WITHDLLS:
-    modules.append('libxmlmods.__init__')
-c_files = ['libxml2-py.c', 'libxml.c', 'types.c' ]
-includes= [xml_includes]
-libs    = [libraryPrefix + "xml2"] + platformLibs
-macros  = []
-if with_threads:
-    macros.append(('_REENTRANT','1'))
-if with_xslt == 1:
-    descr = "libxml2 and libxslt package"
-    if not sys.platform.startswith('win'):
-        #
-        # We are gonna build 2 identical shared libs with merge initializing
-        # both libxml2mod and libxsltmod
-        #
-        c_files = c_files + ['libxslt-py.c', 'libxslt.c']
-        xslt_c_files = c_files
-        macros.append(('MERGED_MODULES', '1'))
-    else:
-        #
-        # On windows the MERGED_MODULE option is not needed
-        # (and does not work)
-        #
-        xslt_c_files = ['libxslt-py.c', 'libxslt.c', 'types.c']
-    libs.insert(0, libraryPrefix + 'exslt')
-    libs.insert(0, libraryPrefix + 'xslt')
-    includes.append(xslt_includes)
-    modules.append('libxslt')
-
-
-extens=[Extension('libxml2mod', c_files, include_dirs=includes,
-                  library_dirs=libdirs,
-                  libraries=libs, define_macros=macros)]
-if with_xslt == 1:
-    extens.append(Extension('libxsltmod', xslt_c_files, include_dirs=includes,
-                            library_dirs=libdirs,
-                            libraries=libs, define_macros=macros))
-
-if missing("MANIFEST"):
-
-    manifest = open("MANIFEST", "w")
-    manifest.write("setup.py\n")
-    for file in xml_files:
-        manifest.write(file + "\n")
-    if with_xslt == 1:
-        for file in xslt_files:
-            manifest.write(file + "\n")
-    manifest.close()
-
-if WITHDLLS:
-    ext_package = "libxmlmods"
-    if sys.version >= "2.2":
-        base = "lib/site-packages/"
-    else:
-        base = ""
-    data_files = [(base+"libxmlmods",packaged_dlls)]
-else:
-    ext_package = None
-    data_files = []
-
-setup (name = "libxml2-python",
-       # On *nix, the version number is created from setup.py.in
-       # On windows, it is set by configure.js
-       version = "2.11.0",
-       description = descr,
-       author = "Daniel Veillard",
-       author_email = "veillard@redhat.com",
-       url = "https://gitlab.gnome.org/GNOME/libxml2",
-       licence="MIT Licence",
-       py_modules=modules,
-       ext_modules=extens,
-       ext_package=ext_package,
-       data_files=data_files,
-       )
-
-sys.exit(0)
-
diff --git a/third_party/libxml/linux/python/tests/Makefile b/third_party/libxml/linux/python/tests/Makefile
deleted file mode 100644
index fe38ee49..0000000
--- a/third_party/libxml/linux/python/tests/Makefile
+++ /dev/null
@@ -1,658 +0,0 @@
-# Makefile.in generated by automake 1.16.5 from Makefile.am.
-# python/tests/Makefile.  Generated from Makefile.in by configure.
-
-# Copyright (C) 1994-2021 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-
-VPATH = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \	]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/libxml2
-pkgincludedir = $(includedir)/libxml2
-pkglibdir = $(libdir)/libxml2
-pkglibexecdir = $(libexecdir)/libxml2
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = x86_64-pc-linux-gnu
-host_triplet = x86_64-pc-linux-gnu
-subdir = python/tests
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_try_compile2.m4 \
-	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
-	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
-	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(dist_example_DATA) \
-	$(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_$(V))
-am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(exampledir)"
-DATA = $(dist_example_DATA)
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' aclocal-1.16
-AMTAR = $${TAR-tar}
-AM_CFLAGS =  -pedantic -Wall -Wextra -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wno-long-long -Wno-format-extra-args
-AM_DEFAULT_VERBOSITY = 0
-AM_LDFLAGS = 
-AR = ar
-AUTOCONF = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoconf
-AUTOHEADER = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' autoheader
-AUTOMAKE = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' automake-1.16
-AWK = gawk
-BASE_THREAD_LIBS = 
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O2
-CPPFLAGS = 
-CSCOPE = cscope
-CTAGS = ctags
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-DLLTOOL = false
-DSYMUTIL = 
-DUMPBIN = 
-ECHO_C = 
-ECHO_N = -n
-ECHO_T = 
-EGREP = /usr/bin/grep -E
-ETAGS = etags
-EXEEXT = 
-FGREP = /usr/bin/grep -F
-FILECMD = file
-GREP = /usr/bin/grep
-ICU_CFLAGS = 
-ICU_DEFS = 
-ICU_LIBS = -licui18n -licuuc -licudata
-INSTALL = /usr/bin/install -c
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
-LD = /usr/bin/ld -m elf_x86_64
-LDFLAGS = 
-LIBM = -lm
-LIBOBJS = 
-LIBS = 
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LIBXML_MAJOR_VERSION = 2
-LIBXML_MICRO_VERSION = 0
-LIBXML_MINOR_VERSION = 11
-LIBXML_VERSION = 2.11.0
-LIBXML_VERSION_EXTRA = 
-LIBXML_VERSION_INFO = 13:0:11
-LIBXML_VERSION_NUMBER = 21100
-LIPO = 
-LN_S = ln -s
-LTLIBOBJS = 
-LT_SYS_LIBRARY_PATH = 
-LZMA_CFLAGS = 
-LZMA_LIBS = 
-MAINT = 
-MAKEINFO = ${SHELL} '/usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/missing' makeinfo
-MANIFEST_TOOL = :
-MKDIR_P = /usr/bin/mkdir -p
-MODULE_EXTENSION = 
-MODULE_PLATFORM_LIBS = 
-NM = /usr/bin/nm -B
-NMEDIT = 
-OBJDUMP = objdump
-OBJEXT = o
-OTOOL = 
-OTOOL64 = 
-PACKAGE = libxml2
-PACKAGE_BUGREPORT = 
-PACKAGE_NAME = libxml2
-PACKAGE_STRING = libxml2 2.11.0
-PACKAGE_TARNAME = libxml2
-PACKAGE_URL = 
-PACKAGE_VERSION = 2.11.0
-PATH_SEPARATOR = :
-PERL = /usr/bin/perl
-PKG_CONFIG = /usr/bin/pkg-config
-PKG_CONFIG_LIBDIR = 
-PKG_CONFIG_PATH = 
-PYTHON = /usr/bin/python
-PYTHON_CFLAGS = -I/usr/include/python3.10 -I/usr/include/x86_64-linux-gnu/python3.10
-PYTHON_EXEC_PREFIX = ${exec_prefix}
-PYTHON_LDFLAGS = 
-PYTHON_LIBS = 
-PYTHON_PLATFORM = linux
-PYTHON_PREFIX = ${prefix}
-PYTHON_VERSION = 3.10
-RANLIB = ranlib
-RDL_CFLAGS = 
-RDL_LIBS = 
-RELDATE = Wed Feb 22 2023
-SED = /usr/bin/sed
-SET_MAKE = 
-SHELL = /bin/sh
-STRIP = strip
-TAR = /usr/bin/tar
-THREAD_CFLAGS =  -D_REENTRANT
-THREAD_LIBS = 
-VERSION = 2.11.0
-VERSION_SCRIPT_FLAGS = -Wl,--version-script=
-WGET = /usr/bin/wget
-WITH_C14N = 0
-WITH_CATALOG = 0
-WITH_DEBUG = 0
-WITH_FTP = 0
-WITH_HTML = 1
-WITH_HTTP = 0
-WITH_ICONV = 0
-WITH_ICU = 1
-WITH_ISO8859X = 0
-WITH_LEGACY = 0
-WITH_LZMA = 0
-WITH_MEM_DEBUG = 0
-WITH_MODULES = 0
-WITH_OUTPUT = 1
-WITH_PATTERN = 0
-WITH_PUSH = 1
-WITH_READER = 1
-WITH_REGEXPS = 0
-WITH_SAX1 = 1
-WITH_SCHEMAS = 0
-WITH_SCHEMATRON = 0
-WITH_THREADS = 1
-WITH_THREAD_ALLOC = 0
-WITH_TREE = 1
-WITH_TRIO = 0
-WITH_VALID = 0
-WITH_WRITER = 1
-WITH_XINCLUDE = 0
-WITH_XPATH = 1
-WITH_XPTR = 0
-WITH_XPTR_LOCS = 0
-WITH_ZLIB = 0
-XML_CFLAGS = 
-XML_INCLUDEDIR = -I${includedir}/libxml2
-XML_LIBDIR = -L${libdir}
-XML_LIBS = -lxml2
-XML_LIBTOOLLIBS = libxml2.la
-XML_PRIVATE_CFLAGS =    -D_REENTRANT  
-XML_PRIVATE_LIBS =     -licui18n -licuuc -licudata -lm 
-XSLTPROC = /usr/bin/xsltproc
-Z_CFLAGS = 
-Z_LIBS = 
-abs_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux/python/tests
-abs_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests
-abs_top_builddir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/linux
-abs_top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_DUMPBIN = 
-am__include = include
-am__leading_dot = .
-am__quote = 
-am__tar = $${TAR-tar} chof - "$$tardir"
-am__untar = $${TAR-tar} xf -
-bindir = ${exec_prefix}/bin
-build = x86_64-pc-linux-gnu
-build_alias = 
-build_cpu = x86_64
-build_os = linux-gnu
-build_vendor = pc
-builddir = .
-datadir = ${datarootdir}
-datarootdir = ${prefix}/share
-docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
-dvidir = ${docdir}
-exec_prefix = ${prefix}
-host = x86_64-pc-linux-gnu
-host_alias = 
-host_cpu = x86_64
-host_os = linux-gnu
-host_vendor = pc
-htmldir = ${docdir}
-includedir = ${prefix}/include
-infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localedir = ${datarootdir}/locale
-localstatedir = ${prefix}/var
-mandir = ${datarootdir}/man
-mkdir_p = $(MKDIR_P)
-oldincludedir = /usr/include
-pdfdir = ${docdir}
-pkgpyexecdir = ${pyexecdir}/libxml2
-pkgpythondir = ${pythondir}/libxml2
-prefix = /usr/local
-program_transform_name = s,x,x,
-psdir = ${docdir}
-pyexecdir = ${PYTHON_EXEC_PREFIX}/lib/python3.10/site-packages
-pythondir = ${PYTHON_PREFIX}/lib/python3.10/site-packages
-runstatedir = ${localstatedir}/run
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src/python/tests
-sysconfdir = ${prefix}/etc
-target_alias = 
-top_build_prefix = ../../
-top_builddir = ../..
-top_srcdir = /usr/local/google/home/jarhar/chromium/src/third_party/libxml/src
-exampledir = $(docdir)/python/examples
-dist_example_DATA = $(PYTESTS) $(XMLS)
-PYTESTS = \
-    build.py	\
-    attribs.py	\
-    tst.py	\
-    tstxpath.py	\
-    xpathext.py	\
-    push.py	\
-    pushSAX.py	\
-    pushSAXhtml.py \
-    error.py	\
-    serialize.py\
-    validate.py	\
-    tstURI.py	\
-    cutnpaste.py\
-    xpathret.py	\
-    xpath.py	\
-    outbuf.py	\
-    inbuf.py	\
-    input_callback.py \
-    resolver.py \
-    regexp.py	\
-    reader.py	\
-    reader2.py	\
-    reader3.py	\
-    reader4.py	\
-    reader5.py	\
-    reader6.py	\
-    reader7.py	\
-    reader8.py	\
-    readernext.py	\
-    walker.py	\
-    nsdel.py	\
-    ctxterror.py\
-    readererr.py\
-    relaxng.py	\
-    schema.py	\
-    thread2.py \
-    sync.py \
-    tstLastError.py \
-    indexes.py \
-    dtdvalid.py \
-    tstmem.py	\
-    validDTD.py	\
-    validSchemas.py \
-    validRNG.py \
-    compareNodes.py \
-    xpathns.py \
-    xpathleak.py
-
-XMLS = \
-    tst.xml	\
-    valid.xml	\
-    invalid.xml	\
-    test.dtd
-
-CLEANFILES = core tmp.xml *.pyc
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-	        && { if test -f $@; then exit 0; else break; fi; }; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign python/tests/Makefile'; \
-	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --foreign python/tests/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-install-dist_exampleDATA: $(dist_example_DATA)
-	@$(NORMAL_INSTALL)
-	@list='$(dist_example_DATA)'; test -n "$(exampledir)" || list=; \
-	if test -n "$$list"; then \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(exampledir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(exampledir)" || exit 1; \
-	fi; \
-	for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  echo "$$d$$p"; \
-	done | $(am__base_list) | \
-	while read files; do \
-	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(exampledir)'"; \
-	  $(INSTALL_DATA) $$files "$(DESTDIR)$(exampledir)" || exit $$?; \
-	done
-
-uninstall-dist_exampleDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_example_DATA)'; test -n "$(exampledir)" || list=; \
-	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-	dir='$(DESTDIR)$(exampledir)'; $(am__uninstall_files_from_dir)
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-distdir: $(BUILT_SOURCES)
-	$(MAKE) $(AM_MAKEFLAGS) distdir-am
-
-distdir-am: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d "$(distdir)/$$file"; then \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-	    fi; \
-	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-	  else \
-	    test -f "$(distdir)/$$file" \
-	    || cp -p $$d/$$file "$(distdir)/$$file" \
-	    || exit 1; \
-	  fi; \
-	done
-#check-local:
-check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) check-local
-check: check-am
-all-am: Makefile $(DATA)
-installdirs:
-	for dir in "$(DESTDIR)$(exampledir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	if test -z '$(STRIP)'; then \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	      install; \
-	else \
-	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-	fi
-mostlyclean-generic:
-
-clean-generic:
-	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-dist_exampleDATA
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-dist_exampleDATA
-
-.MAKE: check-am install-am install-strip
-
-.PHONY: all all-am check check-am check-local clean clean-generic \
-	clean-libtool cscopelist-am ctags-am distclean \
-	distclean-generic distclean-libtool distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
-	install-data-am install-dist_exampleDATA install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	tags-am uninstall uninstall-am uninstall-dist_exampleDATA
-
-.PRECIOUS: Makefile
-
-
-check-local:
-	@for f in $(XMLS) ; do test -f $$f || $(LN_S) $(srcdir)/$$f . ; done
-	@echo "## running Python regression tests"
-	@(export PYTHONPATH="..:../.libs:$(srcdir)/..:$$PYTHONPATH" ; \
-	  export LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \
-	  export DYLD_LIBRARY_PATH="$(top_builddir)/.libs:$$DYLD_LIBRARY_PATH" ; \
-	  export PATH="$(top_builddir)/.libs:$$PATH" ; \
-	  for test in $(PYTESTS) ; do \
-	    log=`$(PYTHON) $(srcdir)/$$test` ; \
-	    if [ "$$?" -ne 0 ] ; then \
-	      echo "-- $$test" ; \
-	      echo "$$log" ; \
-	      exit 1 ; \
-	    fi ; \
-	  done)
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/third_party/libxml/linux/xstc/Makefile b/third_party/libxml/linux/xstc/Makefile
index ccb07dc..6ea2861 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 = Wed Feb 22 2023
+RELDATE = Fri Feb 24 2023
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/sh
diff --git a/third_party/libxml/src/CMakeLists.txt b/third_party/libxml/src/CMakeLists.txt
index e20b315..39d3623 100644
--- a/third_party/libxml/src/CMakeLists.txt
+++ b/third_party/libxml/src/CMakeLists.txt
@@ -356,14 +356,16 @@
 	$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/libxml2>
 )
 
-if(HAVE_DLOPEN)
-	target_link_libraries(LibXml2 PRIVATE dl)
-	set(MODULE_PLATFORM_LIBS "-ldl")
-endif()
+if(LIBXML2_WITH_MODULES)
+	if(HAVE_DLOPEN)
+		target_link_libraries(LibXml2 PRIVATE dl)
+		set(MODULE_PLATFORM_LIBS "-ldl")
+	endif()
 
-if(HAVE_SHLLOAD)
-	target_link_libraries(LibXml2 PRIVATE dld)
-	set(MODULE_PLATFORM_LIBS "-ldld")
+	if(HAVE_SHLLOAD)
+		target_link_libraries(LibXml2 PRIVATE dld)
+		set(MODULE_PLATFORM_LIBS "-ldld")
+	endif()
 endif()
 
 if(UNIX)
diff --git a/third_party/libxml/src/include/private/xinclude.h b/third_party/libxml/src/include/private/xinclude.h
index abd0dc015..43c77e50 100644
--- a/third_party/libxml/src/include/private/xinclude.h
+++ b/third_party/libxml/src/include/private/xinclude.h
@@ -1,9 +1,9 @@
-#ifndef XML_IO_H_PRIVATE__
-#define XML_IO_H_PRIVATE__
+#ifndef XML_INCLUDE_H_PRIVATE__
+#define XML_INCLUDE_H_PRIVATE__
 
 #include <libxml/xinclude.h>
 
 XML_HIDDEN int
 xmlXIncludeSetStreamingMode(xmlXIncludeCtxtPtr ctxt, int mode);
 
-#endif /* XML_IO_H_PRIVATE__ */
+#endif /* XML_INCLUDE_H_PRIVATE__ */
diff --git a/third_party/libxml/src/threads.c b/third_party/libxml/src/threads.c
index 36e5df1..56a917e 100644
--- a/third_party/libxml/src/threads.c
+++ b/third_party/libxml/src/threads.c
@@ -751,7 +751,25 @@
      * long-standing behavior and hard to work around.
      */
     if (libxml_is_threaded == -1)
-        libxml_is_threaded = (pthread_mutex_lock != NULL);
+        libxml_is_threaded =
+            (pthread_getspecific != NULL) &&
+            (pthread_setspecific != NULL) &&
+            (pthread_key_create != NULL) &&
+            (pthread_key_delete != NULL) &&
+            (pthread_mutex_init != NULL) &&
+            (pthread_mutex_destroy != NULL) &&
+            (pthread_mutex_lock != NULL) &&
+            (pthread_mutex_unlock != NULL) &&
+            (pthread_cond_init != NULL) &&
+            (pthread_cond_destroy != NULL) &&
+            (pthread_cond_wait != NULL) &&
+            /*
+             * pthread_equal can be inline, resuting in -Waddress warnings.
+             * Let's assume it's available if all the other functions are.
+             */
+            /* (pthread_equal != NULL) && */
+            (pthread_self != NULL) &&
+            (pthread_cond_signal != NULL);
     if (libxml_is_threaded == 0)
         return;
 #endif /* XML_PTHREAD_WEAK */
@@ -790,6 +808,10 @@
 xmlCleanupThreadsInternal(void)
 {
 #ifdef HAVE_POSIX_THREADS
+#ifdef XML_PTHREAD_WEAK
+    if (libxml_is_threaded == 0)
+        return;
+#endif /* XML_PTHREAD_WEAK */
     pthread_key_delete(globalkey);
 #elif defined(HAVE_WIN32_THREADS)
 #if !defined(HAVE_COMPILER_TLS)
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c
index 0ec34d8..9461150 100644
--- a/third_party/libxml/src/xpath.c
+++ b/third_party/libxml/src/xpath.c
@@ -3049,16 +3049,15 @@
     xmlXPathObjectPtr obj;
     xmlNodeSetPtr ret;
 
-    if (ctxt == NULL) return(NULL);
-    if (ctxt->value == NULL) {
+    obj = valuePop(ctxt);
+    if (obj == NULL) {
 	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
 	return(NULL);
     }
-    if (!xmlXPathStackIsNodeSet(ctxt)) {
+    if (obj->type != XPATH_NODESET) {
 	xmlXPathSetTypeError(ctxt);
 	return(NULL);
     }
-    obj = valuePop(ctxt);
     ret = obj->nodesetval;
 #if 0
     /* to fix memory leak of not clearing obj->user */
@@ -3084,15 +3083,15 @@
     xmlXPathObjectPtr obj;
     void * ret;
 
-    if ((ctxt == NULL) || (ctxt->value == NULL)) {
+    obj = valuePop(ctxt);
+    if (obj == NULL) {
 	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
 	return(NULL);
     }
-    if (ctxt->value->type != XPATH_USERS) {
+    if (obj->type != XPATH_USERS) {
 	xmlXPathSetTypeError(ctxt);
 	return(NULL);
     }
-    obj = valuePop(ctxt);
     ret = obj->user;
     obj->user = NULL;
     xmlXPathReleaseObject(ctxt->context, obj);
diff --git a/third_party/tflite/README.chromium b/third_party/tflite/README.chromium
index 962d3fb..f367234 100644
--- a/third_party/tflite/README.chromium
+++ b/third_party/tflite/README.chromium
@@ -1,8 +1,8 @@
 Name: TensorFlow Lite
 Short Name: tflite
 URL: https://github.com/tensorflow/tensorflow
-Version: 60ec371de65a63d588bcfce7a99482847ad1312e
-Date: 2023/02/16
+Version: f63612ab30f4c880f3379813e5b6b4a3d804f928
+Date: 2023/02/21
 License: Apache 2.0
 License File: LICENSE
 Security Critical: Yes
diff --git a/tools/android/forwarder2/host_controllers_manager_unittest.cc b/tools/android/forwarder2/host_controllers_manager_unittest.cc
index e1c16e3..9fcef68 100644
--- a/tools/android/forwarder2/host_controllers_manager_unittest.cc
+++ b/tools/android/forwarder2/host_controllers_manager_unittest.cc
@@ -25,8 +25,7 @@
   base::FilePath script_file;
   base::ScopedFILE script_file_handle =
       base::CreateAndOpenTemporaryStream(&script_file);
-  base::WriteFile(script_file, script_contents.c_str(),
-                  script_contents.length());
+  base::WriteFile(script_file, script_contents);
   script_file_handle.reset();
   base::SetPosixFilePermissions(script_file,
                                 base::FILE_PERMISSION_READ_BY_USER |
diff --git a/tools/binary_size/libsupersize/apkanalyzer.py b/tools/binary_size/libsupersize/apkanalyzer.py
index 356a8e3..b86b94c 100644
--- a/tools/binary_size/libsupersize/apkanalyzer.py
+++ b/tools/binary_size/libsupersize/apkanalyzer.py
@@ -609,6 +609,6 @@
   map_item_sizes = dexfile.ComputeMapItemSizes()
   metrics = {}
   for item in map_item_sizes:
-    metrics['SIZE.' + item['name']] = item['byte_size']
-    metrics['COUNT.' + item['name']] = item['size']
+    metrics['SIZE/' + item['name']] = item['byte_size']
+    metrics['COUNT/' + item['name']] = item['size']
   return section_ranges, dex_other_symbols, {dex_path: metrics}
diff --git a/tools/binary_size/libsupersize/diff_test.py b/tools/binary_size/libsupersize/diff_test.py
index cdec6a94..9d2e44e 100755
--- a/tools/binary_size/libsupersize/diff_test.py
+++ b/tools/binary_size/libsupersize/diff_test.py
@@ -38,14 +38,14 @@
   section_sizes = {'.text': 100, '.bss': 40}
   metrics_by_file = {
       'classes.dex': {
-          'COUNT.HEADER': 1,
-          'COUNT.STRING_ID': 11,
-          'COUNT.CODE': 3,
-          'COUNT.STRING_DATA': 11,
-          'SIZE.HEADER': 1024,
-          'SIZE.STRING_ID': 44,
-          'SIZE.CODE': 1337,
-          'SIZE.STRING_DATA': 888,
+          'COUNT/HEADER': 1,
+          'COUNT/STRING_ID': 11,
+          'COUNT/CODE': 3,
+          'COUNT/STRING_DATA': 11,
+          'SIZE/HEADER': 1024,
+          'SIZE/STRING_ID': 44,
+          'SIZE/CODE': 1337,
+          'SIZE/STRING_DATA': 888,
       },
   }
   if not containers:
diff --git a/tools/binary_size/libsupersize/file_format.py b/tools/binary_size/libsupersize/file_format.py
index e4f28819..044ae7ac 100644
--- a/tools/binary_size/libsupersize/file_format.py
+++ b/tools/binary_size/libsupersize/file_format.py
@@ -263,6 +263,7 @@
     # Write using old format.
     fields['metadata'] = size_info.metadata_legacy
     fields['section_sizes'] = size_info.containers[0].section_sizes
+    fields['metrics_by_file'] = size_info.containers[0].metrics_by_file
 
   fields_str = json.dumps(fields, indent=2, sort_keys=True)
 
@@ -442,7 +443,7 @@
         models.Container(name='',
                          metadata=metadata,
                          section_sizes=section_sizes,
-                         metrics_by_file={}))
+                         metrics_by_file=fields.get('metrics_by_file', {})))
   models.BaseContainer.AssignShortNames(containers)
 
   has_components = fields.get('has_components', False)
diff --git a/tools/binary_size/libsupersize/testdata/ArchiveContainers.golden b/tools/binary_size/libsupersize/testdata/ArchiveContainers.golden
index 37c5736..d8113bf6 100644
--- a/tools/binary_size/libsupersize/testdata/ArchiveContainers.golden
+++ b/tools/binary_size/libsupersize/testdata/ArchiveContainers.golden
@@ -449,4 +449,4 @@
 Container2:
 Container1:/smalltest.so (x86)
 Container1:
-classes.dex={'COUNT.ANNOTATION': 1, 'COUNT.ANNOTATIONS_DIRECTORY': 1, 'COUNT.ANNOTATION_SET': 2, 'COUNT.CLASS_DATA': 2, 'COUNT.CLASS_DEF': 2, 'COUNT.CODE': 8, 'COUNT.DEBUG_INFO': 8, 'COUNT.ENCODED_ARRAY': 1, 'COUNT.FIELD_ID': 2, 'COUNT.HEADER': 1, 'COUNT.MAP': 1, 'COUNT.METHOD_ID': 14, 'COUNT.PROTO_ID': 10, 'COUNT.STRING_DATA': 40, 'COUNT.STRING_ID': 40, 'COUNT.TYPE': 6, 'COUNT.TYPE_ID': 13, 'SIZE.ANNOTATION': 8, 'SIZE.ANNOTATIONS_DIRECTORY': 24, 'SIZE.ANNOTATION_SET': 12, 'SIZE.CLASS_DATA': 48, 'SIZE.CLASS_DEF': 64, 'SIZE.CODE': 432, 'SIZE.DEBUG_INFO': 72, 'SIZE.ENCODED_ARRAY': 4, 'SIZE.FIELD_ID': 16, 'SIZE.HEADER': 112, 'SIZE.MAP': 208, 'SIZE.METHOD_ID': 112, 'SIZE.PROTO_ID': 120, 'SIZE.STRING_DATA': 522, 'SIZE.STRING_ID': 160, 'SIZE.TYPE': 50, 'SIZE.TYPE_ID': 52}
+classes.dex={'COUNT/ANNOTATION': 1, 'COUNT/ANNOTATIONS_DIRECTORY': 1, 'COUNT/ANNOTATION_SET': 2, 'COUNT/CLASS_DATA': 2, 'COUNT/CLASS_DEF': 2, 'COUNT/CODE': 8, 'COUNT/DEBUG_INFO': 8, 'COUNT/ENCODED_ARRAY': 1, 'COUNT/FIELD_ID': 2, 'COUNT/HEADER': 1, 'COUNT/MAP': 1, 'COUNT/METHOD_ID': 14, 'COUNT/PROTO_ID': 10, 'COUNT/STRING_DATA': 40, 'COUNT/STRING_ID': 40, 'COUNT/TYPE': 6, 'COUNT/TYPE_ID': 13, 'SIZE/ANNOTATION': 8, 'SIZE/ANNOTATIONS_DIRECTORY': 24, 'SIZE/ANNOTATION_SET': 12, 'SIZE/CLASS_DATA': 48, 'SIZE/CLASS_DEF': 64, 'SIZE/CODE': 432, 'SIZE/DEBUG_INFO': 72, 'SIZE/ENCODED_ARRAY': 4, 'SIZE/FIELD_ID': 16, 'SIZE/HEADER': 112, 'SIZE/MAP': 208, 'SIZE/METHOD_ID': 112, 'SIZE/PROTO_ID': 120, 'SIZE/STRING_DATA': 522, 'SIZE/STRING_ID': 160, 'SIZE/TYPE': 50, 'SIZE/TYPE_ID': 52}
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-ui.js b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
index d3f66f3..8d710a57 100644
--- a/tools/binary_size/libsupersize/viewer/static/tree-ui.js
+++ b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
@@ -785,10 +785,22 @@
    */
   function extractMetricsTree(metadata) {
     const EMPTY_OBJ = {};
-
     const diffMode = state.getDiffMode();
-    const containers = metadata?.size_file?.containers ?? [];
-    const beforeContainers = metadata?.before_size_file?.containers ?? [];
+
+    const getOrMakeContainers = (size_file) => {
+      if (size_file) {
+        if (size_file.containers)
+          return size_file.containers;
+        // For old format without explicit containers, synthesize one.
+        const container = {name: '(Default container)'};
+        if (size_file.metrics_by_file)
+          container.metrics_by_file = size_file.metrics_by_file;
+        return [container];
+      }
+      return [];
+    };
+    const containers = getOrMakeContainers(metadata?.size_file);
+    const beforeContainers = getOrMakeContainers(metadata?.before_size_file);
 
     const makeContainerMap = (curContainers) => {
       const ret = new Map();
diff --git a/tools/imagediff/image_diff.cc b/tools/imagediff/image_diff.cc
index 1ecd9d3..a62268b6 100644
--- a/tools/imagediff/image_diff.cc
+++ b/tools/imagediff/image_diff.cc
@@ -485,10 +485,9 @@
   image_diff_png::EncodeRGBAPNG(
       diff_image.data(), diff_image.w(), diff_image.h(),
       diff_image.w() * 4, &png_encoding);
-  if (base::WriteFile(out_file,
-          reinterpret_cast<char*>(&png_encoding.front()),
-          base::checked_cast<int>(png_encoding.size())) < 0)
+  if (!base::WriteFile(out_file, png_encoding)) {
     return kStatusError;
+  }
 
   return kStatusDifferent;
 }
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 3d949aa..b9826db3 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -345,40 +345,40 @@
 
     'chromium.fyi': {
       'Comparison Android (reclient)': {
-        'goma': 'android_webview_google_debug_static_bot_arm64',
-        'reclient': 'android_webview_google_debug_static_bot_arm64_reclient',
+        'build1': 'android_webview_google_debug_static_bot_arm64_reclient',
+        'build2': 'android_webview_google_debug_static_bot_arm64_reclient',
       },
       'Comparison Linux (reclient)': {
-        'goma': 'gpu_tests_release_bot',
-        'reclient': 'gpu_tests_release_bot_reclient',
+        'build1': 'gpu_tests_release_bot_reclient',
+        'build2': 'gpu_tests_release_bot_reclient',
       },
       'Comparison Mac (reclient)': {
-        'goma': 'gpu_tests_release_bot_minimal_symbols_no_nacl',
-        'reclient': 'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build1': 'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build2': 'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
       },
       'Comparison Mac arm64 (reclient)': {
-        'goma': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl',
-        'reclient': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build1': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build2': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
       },
       'Comparison Mac arm64 on arm64 (reclient)': {
-        'goma': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl',
-        'reclient': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build1': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
+        'build2': 'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient',
       },
       'Comparison Simple Chrome (reclient)': {
-        'goma': 'chromeos_amd64-generic_use_fake_dbus_clients_goma',
-        'reclient': 'chromeos_amd64-generic-vm_use_fake_dbus_clients_reclient',
+        'build1': 'chromeos_amd64-generic-vm_use_fake_dbus_clients_reclient',
+        'build2': 'chromeos_amd64-generic-vm_use_fake_dbus_clients_reclient',
       },
       'Comparison Windows (8 cores) (reclient)': {
-        'goma': 'gpu_tests_release_bot_minimal_symbols',
-        'reclient': 'gpu_tests_release_bot_minimal_symbols_reclient',
+        'build1': 'gpu_tests_release_bot_minimal_symbols_reclient',
+        'build2': 'gpu_tests_release_bot_minimal_symbols_reclient',
       },
       'Comparison Windows (reclient)': {
-        'goma': 'gpu_tests_release_bot_minimal_symbols',
-        'reclient': 'gpu_tests_release_bot_minimal_symbols_reclient',
+        'build1': 'gpu_tests_release_bot_minimal_symbols_reclient',
+        'build2': 'gpu_tests_release_bot_minimal_symbols_reclient',
       },
       'Comparison ios (reclient)': {
-        'goma': 'ios_simulator_debug_static_bot_xctest',
-        'reclient': 'ios_simulator_debug_static_bot_xctest_reclient',
+        'build1': 'ios_simulator_debug_static_bot_xctest_reclient',
+        'build2': 'ios_simulator_debug_static_bot_xctest_reclient',
       },
       'Linux Builder (j-500) (reclient)': 'gpu_tests_release_bot_reclient',
       'Linux Builder (reclient compare)': 'gpu_tests_release_bot_reclient',
@@ -869,7 +869,7 @@
 
     'internal.chromeos.fyi': {
       'chromeos-betty-pi-arc-chrome-dchecks': 'chromeos_betty-pi-arc_dchecks_reclient',
-      'chromeos-betty-pi-arc-finch-smoke-chrome': 'chromeos_betty-pi-arc_dchecks',
+      'chromeos-betty-pi-arc-finch-smoke-chrome': 'chromeos_betty-pi-arc_dchecks_reclient',
       'lacros-amd64-generic-chrome-fyi': 'chromeos_amd64-generic_lacros_official_skylab_reclient',
       'lacros-arm-generic-chrome-fyi': 'chromeos_arm-generic_lacros_official_skylab_reclient',
     },
@@ -1057,7 +1057,7 @@
       'gpu-fyi-try-android-p-pixel-2-32': 'gpu_tests_android_release_trybot_reclient',
       'gpu-fyi-try-android-pixel-6-64': 'gpu_tests_android_release_trybot_arm64_reclient',
       'gpu-fyi-try-android-r-pixel-4-32': 'gpu_tests_android_release_trybot_reclient',
-      'gpu-try-android-m-nexus-5x-64': 'gpu_tests_android_release_trybot_arm64',
+      'gpu-try-android-m-nexus-5x-64': 'gpu_tests_android_release_trybot_arm64_reclient',
       'linux_android_dbg_ng': 'android_debug_bot',
       'try-nougat-phone-tester': 'android_debug_trybot_arm64_reclient',
     },
@@ -1065,7 +1065,7 @@
     'tryserver.chromium.angle': {
       'android-angle-chromium-try': 'gpu_tests_android_release_trybot_arm64_fastbuild_reclient',
       'fuchsia-angle-try': 'angle_deqp_release_trybot_fuchsia_reclient',
-      'ios-angle-try-intel': 'angle_deqp_release_trybot_ios',
+      'ios-angle-try-intel': 'angle_deqp_release_trybot_ios_reclient',
       'linux-angle-chromium-try': 'gpu_tests_release_trybot_reclient',
       'mac-angle-chromium-try': 'gpu_tests_release_trybot_reclient',
       'win-angle-chromium-x64-try': 'gpu_tests_release_trybot_reclient',
@@ -1121,12 +1121,12 @@
     },
 
     'tryserver.chromium.dawn': {
-      'android-dawn-arm-rel': 'dawn_tests_android_release_trybot',
-      'dawn-android-arm-deps-rel': 'dawn_tests_android_release_trybot',
+      'android-dawn-arm-rel': 'dawn_tests_android_release_trybot_reclient',
+      'dawn-android-arm-deps-rel': 'dawn_tests_android_release_trybot_reclient',
       'dawn-linux-x64-deps-rel': 'dawn_tests_with_desktop_gl_release_trybot_reclient',
       'dawn-mac-x64-deps-rel': 'dawn_tests_release_trybot_reclient',
-      'dawn-try-mac-amd-exp': 'dawn_tests_release_trybot',
-      'dawn-try-mac-intel-exp': 'dawn_tests_release_trybot',
+      'dawn-try-mac-amd-exp': 'dawn_tests_release_trybot_reclient',
+      'dawn-try-mac-intel-exp': 'dawn_tests_release_trybot_reclient',
       'dawn-try-win-x64-intel-exp': 'dawn_tests_release_trybot_reclient',
       'dawn-try-win-x86-intel-exp': 'dawn_tests_release_trybot_x86_reclient',
       'dawn-try-win10-x64-asan-rel': 'dawn_tests_asan_release_trybot_reclient',
@@ -1134,7 +1134,7 @@
       'dawn-win10-x64-deps-rel': 'dawn_tests_release_trybot_reclient',
       'dawn-win10-x86-deps-rel': 'dawn_tests_release_trybot_x86_reclient',
       'linux-dawn-rel': 'dawn_tests_with_desktop_gl_release_trybot_reclient',
-      'mac-dawn-rel': 'dawn_tests_release_trybot',
+      'mac-dawn-rel': 'dawn_tests_release_trybot_reclient',
       'win-dawn-rel': 'dawn_tests_release_trybot_reclient',
     },
 
@@ -1167,8 +1167,8 @@
       'gpu-fyi-try-linux-nvidia-exp': 'gpu_fyi_tests_release_trybot_reclient',
       'gpu-fyi-try-linux-nvidia-rel': 'gpu_fyi_tests_release_trybot_reclient',
       'gpu-fyi-try-linux-nvidia-tsn': 'gpu_fyi_tests_release_trybot_tsan_reclient',
-      'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_bot',
-      'gpu-try-linux-nvidia-rel': 'gpu_tests_release_trybot',
+      'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_bot_reclient',
+      'gpu-try-linux-nvidia-rel': 'gpu_tests_release_trybot_reclient',
       'layout_test_leak_detection': 'release_trybot_reclient',
       'leak_detection_linux': 'release_trybot_reclient',
       'linux-1mbu-compile-fyi-rel': 'release_trybot_reclient',
@@ -1244,7 +1244,7 @@
       'gpu-fyi-try-mac-amd-retina-dbg': 'gpu_fyi_tests_debug_trybot_reclient',
       'gpu-fyi-try-mac-amd-retina-exp': 'gpu_fyi_tests_release_trybot_reclient',
       'gpu-fyi-try-mac-amd-retina-rel': 'gpu_fyi_tests_release_trybot_reclient',
-      'gpu-fyi-try-mac-arm64-apple-m1-exp': 'gpu_fyi_tests_release_trybot_arm64',
+      'gpu-fyi-try-mac-arm64-apple-m1-exp': 'gpu_fyi_tests_release_trybot_arm64_reclient',
       'gpu-fyi-try-mac-arm64-apple-m1-rel': 'gpu_fyi_tests_release_trybot_arm64_reclient',
       'gpu-fyi-try-mac-intel-asan': 'gpu_fyi_tests_release_trybot_asan_reclient',
       'gpu-fyi-try-mac-intel-dbg': 'gpu_fyi_tests_debug_trybot_reclient',
@@ -1264,7 +1264,7 @@
       'ios-simulator-code-coverage': 'clang_code_coverage_ios_xctest_sim_reclient',
       'ios-simulator-cr-recipe': 'ios_simulator_debug_static_bot_xctest',
       'ios-simulator-cronet': 'ios_cronet_xctest_reclient',
-      'ios-simulator-full-configs': 'ios_simulator_code_coverage_partial_instrumentation_xctest',
+      'ios-simulator-full-configs': 'ios_simulator_code_coverage_partial_instrumentation_xctest_reclient',
       'ios-simulator-inverse-fieldtrials-fyi': 'ios_simulator_debug_static_bot_invert_fieldtrials_xctest_reclient',
       'ios-simulator-multi-window': 'ios_simulator_debug_static_bot_xctest_reclient',
       'ios-simulator-noncq': 'ios_simulator_debug_static_bot_xctest_reclient',
@@ -1279,7 +1279,7 @@
       'mac-inverse-fieldtrials-fyi-rel': 'gpu_tests_release_trybot_invert_fieldtrials',
       'mac-osxbeta-rel': 'gpu_tests_debug_trybot_reclient',
       'mac-perfetto-rel': 'perfetto_release_trybot_reclient',
-      'mac-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage',
+      'mac-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage_reclient',
       'mac10.15-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac11-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols_reclient',
       'mac11-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
@@ -1289,13 +1289,13 @@
       'mac12-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac13-arm64-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
       'mac13-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
-      'mac_chromium_10.13_rel_ng': 'release_trybot',
+      'mac_chromium_10.13_rel_ng': 'release_trybot_reclient',
       'mac_chromium_10.14_rel_ng': 'release_trybot_reclient',
       'mac_chromium_10.15_rel_ng': 'release_trybot_no_nacl_reclient',
       'mac_chromium_11.0_rel_ng': 'release_trybot_reclient',
       'mac_chromium_archive_rel_ng': 'release_bot_mac_strip_minimal_symbols_reclient',
       'mac_chromium_asan_rel_ng': 'asan_dcheck_disable_nacl_release_bot_reclient',
-      'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_bot',
+      'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_bot_reclient',
       'mac_chromium_compile_rel_ng': 'gpu_tests_release_trybot_reclient',
       'mac_chromium_dbg_ng': 'gpu_tests_debug_bot_reclient',
       'mac_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot_reclient',
@@ -1335,7 +1335,7 @@
       'linux-swangle-chromium-try-x64': 'gpu_tests_release_trybot_reclient',
       'linux-swangle-try-tot-swiftshader-x64': 'angle_deqp_release_trybot_reclient',
       'linux-swangle-try-x64': 'angle_deqp_release_trybot_reclient',
-      'mac-swangle-chromium-try-x64': 'gpu_tests_release_trybot',
+      'mac-swangle-chromium-try-x64': 'gpu_tests_release_trybot_reclient',
       'win-swangle-chromium-try-x86': 'gpu_tests_release_trybot_x86_resource_allowlisting_reclient',
       'win-swangle-try-tot-swiftshader-x64': 'angle_deqp_release_trybot_reclient',
       'win-swangle-try-tot-swiftshader-x86': 'angle_deqp_release_trybot_x86_reclient',
@@ -1755,10 +1755,6 @@
       'android_fastbuild', 'webview_trichrome', 'webview_shell',
     ],
 
-    'android_webview_google_debug_static_bot_arm64': [
-      'android', 'debug_static_bot', 'arm64', 'webview_google',
-    ],
-
     'android_webview_google_debug_static_bot_arm64_reclient': [
       'android', 'debug_static_bot_reclient', 'arm64', 'webview_google',
     ],
@@ -1803,8 +1799,8 @@
       'angle_deqp_tests', 'shared_release_trybot_reclient', 'fuchsia',
     ],
 
-    'angle_deqp_release_trybot_ios': [
-      'angle_deqp_tests', 'release_trybot', 'ios', 'ios_simulator', 'ios_cpu_x64', 'xctest',
+    'angle_deqp_release_trybot_ios_reclient': [
+      'angle_deqp_tests', 'release_trybot_reclient', 'ios', 'ios_simulator', 'ios_cpu_x64', 'xctest',
     ],
 
     'angle_deqp_release_trybot_reclient': [
@@ -2027,10 +2023,6 @@
       'chromeos_amd64-generic-crostoolchain_reclient', 'lacros', 'release', 'is_skylab',
     ],
 
-    'chromeos_amd64-generic_use_fake_dbus_clients_goma':[
-      'chromeos_amd64-generic_goma', 'use_fake_dbus_clients', 'also_build_lacros_chrome_for_architecture_amd64',
-    ],
-
     'chromeos_amd64-generic_use_fake_dbus_clients_vm_optimized': [
       'chromeos_amd64-generic-vm', 'use_fake_dbus_clients', 'also_build_lacros_chrome_for_architecture_amd64',
     ],
@@ -2409,10 +2401,6 @@
       'codesearch', 'android_without_codecs', 'static', 'goma',
     ],
 
-    'dawn_tests_android_release_trybot': [
-      'dawn_no_gl', 'android', 'release_trybot_minimal_symbols',
-    ],
-
     'dawn_tests_android_release_trybot_reclient': [
       'dawn_no_gl', 'android', 'release_trybot_minimal_symbols_reclient',
     ],
@@ -2433,10 +2421,6 @@
       'dawn_tests', 'release_trybot_minimal_symbols_reclient', 'x86',
     ],
 
-    'dawn_tests_release_trybot': [
-      'dawn_tests', 'release_trybot',
-    ],
-
     'dawn_tests_release_trybot_reclient': [
       'dawn_tests', 'release_trybot_reclient',
     ],
@@ -2539,10 +2523,6 @@
       'gpu_fyi_tests', 'dx12vk', 'release_trybot_minimal_symbols_reclient', 'disable_nacl',
     ],
 
-    'gpu_fyi_tests_release_trybot_arm64': [
-      'gpu_fyi_tests', 'release_trybot_minimal_symbols', 'arm64', 'disable_nacl',
-    ],
-
     'gpu_fyi_tests_release_trybot_arm64_reclient': [
       'gpu_fyi_tests', 'release_trybot_minimal_symbols_reclient', 'arm64', 'disable_nacl',
     ],
@@ -2582,10 +2562,6 @@
       'android_no_proguard', 'use_clang_coverage',
     ],
 
-    'gpu_tests_android_release_trybot_arm64': [
-      'gpu_tests', 'android', 'release_trybot_minimal_symbols', 'arm64', 'static_angle',
-    ],
-
     'gpu_tests_android_release_trybot_arm64_fastbuild_reclient': [
       'gpu_tests', 'android', 'release_trybot_reclient', 'arm64', 'static_angle',
       'android_fastbuild',
@@ -2656,10 +2632,6 @@
       'gpu_tests', 'release_bot_reclient', 'devtools_do_typecheck',
     ],
 
-    'gpu_tests_release_bot_minimal_symbols': [
-      'gpu_tests', 'release_bot', 'minimal_symbols',
-    ],
-
     'gpu_tests_release_bot_minimal_symbols_chrome_for_testing_reclient': [
       'gpu_tests', 'release_bot_reclient', 'minimal_symbols',
       'chrome_for_testing',
@@ -2670,10 +2642,6 @@
       'partial_code_coverage_instrumentation',
     ],
 
-    'gpu_tests_release_bot_minimal_symbols_no_nacl': [
-      'gpu_tests', 'release_bot', 'minimal_symbols', 'disable_nacl',
-    ],
-
     'gpu_tests_release_bot_minimal_symbols_no_nacl_reclient': [
       'gpu_tests', 'release_bot_reclient', 'minimal_symbols', 'disable_nacl',
     ],
@@ -2706,10 +2674,6 @@
       'gpu_tests', 'release_bot_reclient', 'x86', 'no_symbols',
     ],
 
-    'gpu_tests_release_trybot': [
-      'gpu_tests', 'release_trybot',
-    ],
-
     'gpu_tests_release_trybot_invert_fieldtrials': [
       'gpu_tests', 'release_trybot', 'invert_fieldtrials',
     ],
@@ -2735,8 +2699,8 @@
       'chrome_for_testing',
     ],
 
-    'gpu_tests_release_trybot_no_symbols_mac_code_coverage': [
-      'gpu_tests', 'release_trybot', 'no_symbols',
+    'gpu_tests_release_trybot_no_symbols_mac_code_coverage_reclient': [
+      'gpu_tests', 'release_trybot_reclient', 'no_symbols',
       'use_clang_coverage', 'partial_code_coverage_instrumentation'
     ],
 
@@ -2876,10 +2840,6 @@
       'ios', 'ios_simulator', 'debug', 'use_blink', 'xctest'
     ],
 
-    'ios_simulator_code_coverage_partial_instrumentation_xctest': [
-      'use_clang_coverage', 'debug_static_bot', 'x64', 'ios', 'ios_simulator', 'partial_code_coverage_instrumentation', 'xctest',
-    ],
-
     'ios_simulator_code_coverage_partial_instrumentation_xctest_reclient': [
       'use_clang_coverage', 'debug_static_bot_reclient', 'x64', 'ios', 'ios_simulator', 'partial_code_coverage_instrumentation', 'xctest',
     ],
@@ -3064,10 +3024,6 @@
       'dcheck_off', 'debug', 'shared'
     ],
 
-    'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl': [
-      'arm64', 'gpu_tests', 'release_bot', 'minimal_symbols', 'disable_nacl',
-    ],
-
     'mac_arm64_gpu_tests_release_bot_minimal_symbols_no_nacl_reclient': [
       'arm64', 'gpu_tests', 'release_bot_reclient', 'minimal_symbols', 'disable_nacl',
     ],
@@ -3909,10 +3865,6 @@
       'mixins': ['chromeos_device_reclient', 'amd64-generic-vm', 'ozone_headless']
     },
 
-    'chromeos_amd64-generic_goma': {
-      'mixins': ['chromeos_device', 'amd64-generic-vm',]
-    },
-
     'chromeos_amd64-generic_reclient': {
       'mixins': ['chromeos_device_reclient', 'amd64-generic', 'ozone_headless']
     },
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 748c889..c4ea550 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -1,6 +1,6 @@
 {
   "Comparison Android (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "debuggable_apks": false,
         "ffmpeg_branding": "Chrome",
@@ -11,10 +11,10 @@
         "system_webview_package_name": "com.google.android.webview",
         "target_cpu": "arm64",
         "target_os": "android",
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "debuggable_apks": false,
         "ffmpeg_branding": "Chrome",
@@ -30,17 +30,17 @@
     }
   },
   "Comparison Linux (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
         "is_component_build": false,
         "is_debug": false,
         "proprietary_codecs": true,
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
@@ -52,7 +52,7 @@
     }
   },
   "Comparison Mac (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -61,10 +61,10 @@
         "is_debug": false,
         "proprietary_codecs": true,
         "symbol_level": 1,
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -78,7 +78,7 @@
     }
   },
   "Comparison Mac arm64 (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -88,10 +88,10 @@
         "proprietary_codecs": true,
         "symbol_level": 1,
         "target_cpu": "arm64",
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -106,7 +106,7 @@
     }
   },
   "Comparison Mac arm64 on arm64 (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -116,10 +116,10 @@
         "proprietary_codecs": true,
         "symbol_level": 1,
         "target_cpu": "arm64",
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "enable_nacl": false,
@@ -134,18 +134,18 @@
     }
   },
   "Comparison Simple Chrome (reclient)": {
-    "goma": {
+    "build1": {
       "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
       "gn_args": {
         "also_build_lacros_chrome_for_architecture": "amd64",
         "dcheck_always_on": false,
         "is_chromeos_device": true,
         "ozone_platform_headless": true,
-        "use_goma": true,
-        "use_real_dbus_clients": false
+        "use_real_dbus_clients": false,
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
       "gn_args": {
         "also_build_lacros_chrome_for_architecture": "amd64",
@@ -158,7 +158,7 @@
     }
   },
   "Comparison Windows (8 cores) (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
@@ -166,10 +166,10 @@
         "is_debug": false,
         "proprietary_codecs": true,
         "symbol_level": 1,
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
@@ -182,7 +182,7 @@
     }
   },
   "Comparison Windows (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
@@ -190,10 +190,10 @@
         "is_debug": false,
         "proprietary_codecs": true,
         "symbol_level": 1,
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "dcheck_always_on": false,
         "ffmpeg_branding": "Chrome",
@@ -206,7 +206,7 @@
     }
   },
   "Comparison ios (reclient)": {
-    "goma": {
+    "build1": {
       "gn_args": {
         "enable_run_ios_unittests_with_xctest": true,
         "is_component_build": false,
@@ -215,10 +215,10 @@
         "target_cpu": "x64",
         "target_environment": "simulator",
         "target_os": "ios",
-        "use_goma": true
+        "use_remoteexec": true
       }
     },
-    "reclient": {
+    "build2": {
       "gn_args": {
         "enable_run_ios_unittests_with_xctest": true,
         "is_component_build": false,
diff --git a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
index 3eeac6a..447b1e1 100644
--- a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
@@ -23,8 +23,8 @@
       "is_chromeos_device": true,
       "is_official_build": true,
       "ozone_platform_headless": true,
-      "use_goma": true,
-      "use_real_dbus_clients": false
+      "use_real_dbus_clients": false,
+      "use_remoteexec": true
     }
   },
   "lacros-amd64-generic-chrome-fyi": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
index 418c8e8..c65f495 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -1165,7 +1165,7 @@
       "symbol_level": 1,
       "target_cpu": "arm64",
       "target_os": "android",
-      "use_goma": true,
+      "use_remoteexec": true,
       "use_static_angle": true
     }
   },
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.angle.json b/tools/mb/mb_config_expectations/tryserver.chromium.angle.json
index a6706e6c..b535ee43 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.angle.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.angle.json
@@ -37,7 +37,7 @@
       "target_cpu": "x64",
       "target_environment": "simulator",
       "target_os": "ios",
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "linux-angle-chromium-try": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json b/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json
index 72c04dc..8bbb984f4 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.dawn.json
@@ -10,7 +10,7 @@
       "symbol_level": 1,
       "target_os": "android",
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "dawn-android-arm-deps-rel": {
@@ -24,7 +24,7 @@
       "symbol_level": 1,
       "target_os": "android",
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "dawn-linux-x64-deps-rel": {
@@ -58,7 +58,7 @@
       "is_debug": false,
       "symbol_level": 0,
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "dawn-try-mac-intel-exp": {
@@ -69,7 +69,7 @@
       "is_debug": false,
       "symbol_level": 0,
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "dawn-try-win-x64-intel-exp": {
@@ -162,7 +162,7 @@
       "is_debug": false,
       "symbol_level": 0,
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "win-dawn-rel": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index d91d0da3..129175a 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -131,7 +131,7 @@
       "is_debug": true,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "gpu-try-linux-nvidia-rel": {
@@ -142,7 +142,7 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 0,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "layout_test_leak_detection": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
index 5d0daf66..0e0dc112 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
@@ -69,7 +69,7 @@
       "proprietary_codecs": true,
       "symbol_level": 1,
       "target_cpu": "arm64",
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "gpu-fyi-try-mac-arm64-apple-m1-rel": {
@@ -341,7 +341,7 @@
       "target_environment": "simulator",
       "target_os": "ios",
       "use_clang_coverage": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "ios-simulator-inverse-fieldtrials-fyi": {
@@ -521,7 +521,7 @@
       "proprietary_codecs": true,
       "symbol_level": 0,
       "use_clang_coverage": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "mac10.15-wpt-content-shell-fyi-rel": {
@@ -617,7 +617,7 @@
       "is_component_build": false,
       "is_debug": false,
       "symbol_level": 0,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "mac_chromium_10.14_rel_ng": {
@@ -675,7 +675,7 @@
       "is_debug": true,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "mac_chromium_compile_rel_ng": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.swangle.json b/tools/mb/mb_config_expectations/tryserver.chromium.swangle.json
index 52370803..4f7aa029 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.swangle.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.swangle.json
@@ -38,7 +38,7 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 0,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "win-swangle-chromium-try-x86": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 6ea707d3..4e4dbc3 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -26946,6 +26946,7 @@
   <int value="2" label="To JSON"/>
   <int value="3" label="To @puppeteer/replay"/>
   <int value="4" label="To extension"/>
+  <int value="5" label="To Lighthouse"/>
 </enum>
 
 <enum name="DevToolsRecordingReplayFinished">
@@ -37511,45 +37512,6 @@
   <int value="1" label="v2"/>
 </enum>
 
-<enum name="FaultTolerantHeap">
-  <int value="0" label="FTH_OFF">FTH is completely off.</int>
-  <int value="1" label="FTH_HKLM">FTH is enabled in HKLM.</int>
-  <int value="2" label="FTH_HKCU">FTH is enabled in HKCU.</int>
-  <int value="3" label="FTH_HKCU_HKLM">FTH is enabled in HKCU and HKLM.</int>
-  <int value="4" label="FTH_ACLAYERS">AcLayers.dll is loaded.</int>
-  <int value="5" label="FTH_ACLAYERS_HKLM">
-    AcLayers.dll is loaded and FTH is enabled in HKLM.
-  </int>
-  <int value="6" label="FTH_ACLAYERS_HKCU">
-    AcLayers.dll is loaded and FTH is enabled in HKCU.
-  </int>
-  <int value="7" label="FTH_ACLAYERS_HKCU_HKLM">
-    AcLayers.dll is loaded and FTH is enabled in HKCU and HKLM.
-  </int>
-  <int value="8" label="FTH_ACXTRNAL">AcXtrnal is loaded.</int>
-  <int value="9" label="FTH_ACXTRNAL_HKLM">
-    AcXtrnal is loaded and FTH is enabled in HKLM.
-  </int>
-  <int value="10" label="FTH_ACXTRNAL_HKCU">
-    AcXtrnal is loaded and FTH is enabled in HKCU.
-  </int>
-  <int value="11" label="FTH_ACXTRNAL_HKCU_HKLM">
-    AcXtrnal is loaded and FTH is enabled in HKCU and HKLM.
-  </int>
-  <int value="12" label="FTH_ACXTRNAL_ACLAYERS">
-    AcXtrmal and AcLayers.dll are loaded.
-  </int>
-  <int value="13" label="FTH_ACXTRNAL_ACLAYERS_HKLM">
-    AcXtrmal and AcLayers.dll are loaded and FTH is enabled in HKLM.
-  </int>
-  <int value="14" label="FTH_ACXTRNAL_ACLAYERS_HKCU">
-    AcXtrmal and AcLayers.dll are loaded and FTH is enabled in HKCU.
-  </int>
-  <int value="15" label="FTH_ACXTRNAL_ACLAYERS_HKCU_HKLM">
-    AcXtrmal and AcLayers.dll are loaded and FTH is enabled in HKCU and HKLM.
-  </int>
-</enum>
-
 <enum name="FaviconAvailabilityStatus">
   <int value="0" label="Favicon available locally"/>
   <int value="1" label="Favicon available via sync"/>
@@ -63130,6 +63092,7 @@
   <int value="709850261" label="disable-touch-editing"/>
   <int value="710700286" label="ImmersiveFullscreen:disabled"/>
   <int value="711424932" label="enable-cloud-print-xps"/>
+  <int value="712484984" label="SlimCompositor:enabled"/>
   <int value="713946324" label="OmniboxSearchReadyIncognito:disabled"/>
   <int value="714714531" label="VcControlsUi:enabled"/>
   <int value="714871827" label="FastPairSoftwareScanning:enabled"/>
@@ -64959,6 +64922,7 @@
   <int value="1761576233" label="OmniboxReportAssistedQueryStats:disabled"/>
   <int value="1761920078"
       label="OverrideSimilarLanguagesForHrefTranslate:enabled"/>
+  <int value="1762033271" label="SlimCompositor:disabled"/>
   <int value="1762320532" label="AutofillKeyboardAccessory:enabled"/>
   <int value="1762346365"
       label="RevokeNotificationsPermissionIfDisabledOnAppLevel:enabled"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 3d2a1b0..77cef579 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -2746,12 +2746,15 @@
 </histogram>
 
 <histogram name="Ash.DragWindowFromShelf.PresentationTime" units="ms"
-    expires_after="2022-10-04">
+    expires_after="2024-02-22">
   <owner>tbarzic@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <summary>
     Presentation time in ms when a window is dragged from the bottom of the
     shelf. Recorded when the drag action is in progress.
+
+    Warning: this histogram was expired from 2022-10-04 to 2023-02-22; data may
+    be missing.
   </summary>
 </histogram>
 
@@ -6282,7 +6285,7 @@
 </histogram>
 
 <histogram name="Ash.WindowCycleView.AnimationSmoothness.Container" units="%"
-    expires_after="2022-04-10">
+    expires_after="2024-02-22">
   <owner>yjliu@chromium.org</owner>
   <owner>chromeos-wmp@google.com</owner>
   <summary>
@@ -6290,11 +6293,14 @@
     moves the next window into position when alt + tab is pressed. 100%
     represents ideally smooth 60 frames per second. 50% represents when only 30
     frames per second is achieved during the animations. 0% should not happen.
+
+    Warning: this histogram was expired from 2022-04-10 to 2023-02-22; data may
+    be missing.
   </summary>
 </histogram>
 
 <histogram name="Ash.WindowCycleView.AnimationSmoothness.Show" units="%"
-    expires_after="2022-04-10">
+    expires_after="2024-02-22">
   <owner>yjliu@chromium.org</owner>
   <owner>chromeos-wmp@google.com</owner>
   <summary>
@@ -6302,6 +6308,9 @@
     starts. 100% represents ideally smooth 60 frames per second. 50% represents
     when only 30 frames per second is achieved during the animations. 0% should
     not happen.
+
+    Warning: this histogram was expired from 2022-04-10 to 2023-02-22; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/gcm/histograms.xml b/tools/metrics/histograms/metadata/gcm/histograms.xml
index fd679d7..d3dd4b0 100644
--- a/tools/metrics/histograms/metadata/gcm/histograms.xml
+++ b/tools/metrics/histograms/metadata/gcm/histograms.xml
@@ -188,15 +188,6 @@
   </token>
 </histogram>
 
-<histogram name="GCM.HeartbeatMissedDelta" units="ms"
-    expires_after="2018-08-30">
-  <owner>zea@chromium.org</owner>
-  <summary>
-    If a heartbeat was missed, the time delta by which it was missed (in system
-    time, not ticks).
-  </summary>
-</histogram>
-
 <histogram name="GCM.IncomingSendErrors" units="messages" expires_after="M98">
   <owner>peter@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
@@ -388,11 +379,6 @@
   </summary>
 </histogram>
 
-<histogram name="GCM.SuspendTime" units="ms" expires_after="2018-08-30">
-  <owner>zea@chromium.org</owner>
-  <summary>Time elapsed from machine suspend until resume.</summary>
-</histogram>
-
 <histogram name="GCM.UnregistrationRequestStatus"
     enum="GCMUnregistrationRequestStatus" expires_after="M88">
   <owner>peter@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 1fe3f2a5..095a465 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3253,7 +3253,7 @@
 </histogram>
 
 <histogram name="ContextMenu.SelectedOptionAndroid.{LinkType}.NewTabOption"
-    enum="SelectedNewTabCreationOption" expires_after="M95">
+    enum="SelectedNewTabCreationOption" expires_after="M120">
   <owner>meiliang@chromium.org</owner>
   <owner>sbirch@chromium.org</owner>
   <summary>
@@ -5867,16 +5867,6 @@
   </summary>
 </histogram>
 
-<histogram name="FaultTolerantHeap" enum="FaultTolerantHeap"
-    expires_after="M77">
-  <owner>brucedawson@chromium.org</owner>
-  <summary>
-    Records several bits of information about whether the Windows
-    FaultTolerantHeap might be enabled. This is logged (from a delayed task)
-    when the browser process starts up.
-  </summary>
-</histogram>
-
 <histogram name="Favicon.OnDemandIconExistsInDb" units="units"
     expires_after="2021-06-08">
   <obsolete>
@@ -13571,15 +13561,6 @@
   </summary>
 </histogram>
 
-<histogram name="ThirdPartyModules.TimeDateStampObtained" enum="BooleanSuccess"
-    expires_after="M85">
-  <owner>pmonette@chromium.org</owner>
-  <summary>
-    Indicates whether the TimeDateStamp for a loaded module was successfully
-    obtained.
-  </summary>
-</histogram>
-
 <histogram name="ThirdPartyModules.Uninstallable" enum="BooleanUninstallable"
     expires_after="M85">
   <owner>pmonette@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 0201fc5..f6c6871 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -1640,7 +1640,7 @@
 </histogram>
 
 <histogram name="PageLoad.Experimental.ClickInputBurst" units="count"
-    expires_after="2021-08-09">
+    expires_after="2024-02-24">
   <owner>dougarnett@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <owner>sullivan@chromium.org</owner>
@@ -1649,6 +1649,8 @@
     a sequence of user click inputs at approximately the same screen position
     where the clicks each occur soon after the previous one (e.g., within half
     second). This is intended to detect possible rage clicks by the user.
+
+    Note: stat collection stopped in August 2021, and resumes in February 2023.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml
index 26226bc..8450240 100644
--- a/tools/metrics/histograms/metadata/prefetch/histograms.xml
+++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -407,7 +407,7 @@
 </histogram>
 
 <histogram name="PrefetchProxy.Prefetch.StreamingURLLoaderFinalStatus"
-    units="PrefetchStreamingURLLoaderStatus" expires_after="2023-07-23">
+    enum="PrefetchStreamingURLLoaderStatus" expires_after="2023-07-23">
   <owner>curranmax@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>spelchat@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 1398a72..db64c031 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -2082,7 +2082,7 @@
     <variant name="Enabled" summary="enabled"/>
   </token>
   <token key="PromptType">
-    <variant name="Message" summary="android message"/>
+    <variant name="Message" summary="android or iOS message"/>
     <variant name="Notification" summary="desktop notification"/>
   </token>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index a007e32..1cbc085f 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -943,7 +943,7 @@
 </histogram>
 
 <histogram name="SessionRestore.ForegroundTabFirstPaint4" units="ms"
-    expires_after="2022-10-23">
+    expires_after="2024-02-22">
   <owner>chrisha@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -953,6 +953,9 @@
     restore until its first paint, and no non-restored tab is painted during
     that time. See SessionRestore.ForegroundTabFirstPaint4.FinishReason for when
     this is not recorded.
+
+    Warning: this histogram was expired from 2022-10-23 to 2023-02-22; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index 3be3ed6..caa8dc0b 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -503,6 +503,10 @@
 <histogram
     name="Sharing.SharingHubAndroid.TimeToSaveScreenshotImageBeforeShare"
     units="ms" expires_after="M110">
+  <obsolete>
+    No longer gathered for several milestones as of M111. Not sure precisely
+    when gathering of this metric stopped.
+  </obsolete>
   <owner>skare@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 6cc8c711..a00631b5 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/1d202f2412734f1e782d991618c7c4a7952e8738/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "7a5fbb9d865715d5e5a81f1a8a3f1c6e072088ed",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/8a7191b80aaec8a3dcf97a7884c11605850275c4/trace_processor_shell.exe"
+            "hash": "29b1feda196dd18068e5ccab2b3a638ca9731d4c",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/6a84e7b38165dd5d14af8dc4faa47cad2caf8709/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "0606572451d2b1efd97a9cbc99906d2ca8351d1f",
diff --git a/tools/typescript/path_mappings.py b/tools/typescript/path_mappings.py
index 6027fb6..858acb8 100644
--- a/tools/typescript/path_mappings.py
+++ b/tools/typescript/path_mappings.py
@@ -27,11 +27,7 @@
 
   path_mappings = {}
   for c in shared_ts_folders:
-    # TODO(dpapad): Rename //ui/webui/resources/mojo:library to
-    # //ui/webui/resources/mojo:build_ts and remove this special casing.
-    target_name = 'library' if c == "mojo" else 'build_ts'
-
-    path_mappings[f'//ui/webui/resources/{c}:{target_name}'] = [(
+    path_mappings[f'//ui/webui/resources/{c}:build_ts'] = [(
         f'//resources/{c}/*',
         f'{root_gen_dir}/ui/webui/resources/tsc/{c}/*',
     )]
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py
index 644e57c..163fa354 100644
--- a/tools/typescript/validate_tsconfig.py
+++ b/tools/typescript/validate_tsconfig.py
@@ -121,9 +121,10 @@
   # Specific exceptions for directories that are still migrating to TS.
   migrating_directories = [
       'chrome/browser/resources/bluetooth_internals',
-      'chrome/browser/resources/ntp4',
       'chrome/browser/resources/chromeos/accessibility',
       'chrome/browser/resources/chromeos/emoji_picker',
+      'chrome/browser/resources/nearby_share/shared',
+      'chrome/browser/resources/ntp4',
       'chrome/browser/resources/settings/chromeos/tsc_input',
       'chrome/test/data/webui',
       'chrome/test/data/webui/chromeos',
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom
index 58102733..6e786a5c 100644
--- a/ui/accessibility/ax_enums.mojom
+++ b/ui/accessibility/ax_enums.mojom
@@ -1300,7 +1300,7 @@
   kTitle,
 
   // The description comes from a non-tooltip popover, e.g. the
-  // |popovertoggletarget| attribute pointing to `popover=auto`.
+  // |popovertarget| attribute pointing to a `popover=auto`.
   kPopoverAttribute,
 };
 
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc
index c0c05bf..d3b8a6b5 100644
--- a/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -1256,8 +1256,7 @@
       case ax::mojom::DescriptionFrom::kPopoverAttribute:
         // The following types of markup are mapped to "tooltip":
         // * The title attribute.
-        // * A related popover=something related via popovertoggletarget /
-        // popovershowtarget / popoverhidetarget.
+        // * A popover=something related via the `popovertarget` attribute.
         // * A tooltip related via aria-describedby (see kRelatedElement above).
         from = "tooltip";
         break;
diff --git a/ui/chromeos/styles/cros_sys_colors.json5 b/ui/chromeos/styles/cros_sys_colors.json5
index 146345053..3f352e4f 100644
--- a/ui/chromeos/styles/cros_sys_colors.json5
+++ b/ui/chromeos/styles/cros_sys_colors.json5
@@ -177,6 +177,19 @@
       light: '$cros.ref.neutral20',
       dark:  '$cros.ref.neutral90',
     },
+    'scrollbar': {
+      light: 'rgba($cros.ref.neutralvariant60.rgb, 0.6)',
+      dark: 'rgba($cros.ref.neutralvariant50.rgb, 0.6)',
+    },
+    'scrollbar-hover': {
+      light: 'rgba($cros.ref.neutralvariant30.rgb, 0.6)',
+      dark: 'rgba($cros.ref.neutralvariant90.rgb, 0.6)',
+    },
+    'scrollbar-border': {
+      light: 'rgba($cros.ref.neutralvariant100.rgb, 0.14)',
+      dark: 'rgba($cros.ref.neutralvariant0.rgb, 0.14)',
+    },
+
     'input-field-light': {
       light: '$cros.ref.neutral99',
       dark: 'rgba($cros.ref.neutral50.rgb, 0.4)'
diff --git a/ui/color/color_id.h b/ui/color/color_id.h
index 1e5092d..66af287 100644
--- a/ui/color/color_id.h
+++ b/ui/color/color_id.h
@@ -181,7 +181,8 @@
   E_CPONLY(kColorAccentWithGuaranteedContrastAtopPrimaryBackground) \
   E_CPONLY(kColorAlertHighSeverity) \
   E_CPONLY(kColorAlertLowSeverity) \
-  E_CPONLY(kColorAlertMediumSeverity) \
+  E_CPONLY(kColorAlertMediumSeverityIcon) \
+  E_CPONLY(kColorAlertMediumSeverityText) \
   E_CPONLY(kColorDisabledForeground) \
   E_CPONLY(kColorEndpointBackground) \
   E_CPONLY(kColorEndpointForeground) \
diff --git a/ui/color/color_transform.cc b/ui/color/color_transform.cc
index 327149f..4cd6f7e8 100644
--- a/ui/color/color_transform.cc
+++ b/ui/color/color_transform.cc
@@ -286,39 +286,44 @@
 
 ColorTransform PickGoogleColor(ColorTransform foreground_transform,
                                ColorTransform background_transform,
-                               float min_contrast) {
+                               float min_contrast,
+                               float max_contrast) {
   const auto generator =
       [](ColorTransform foreground_transform,
          ColorTransform background_transform, float min_contrast,
-         SkColor input_color, const ColorMixer& mixer) {
+         float max_contrast, SkColor input_color, const ColorMixer& mixer) {
         const SkColor foreground_color =
             foreground_transform.Run(input_color, mixer);
         const SkColor background_color =
             background_transform.Run(input_color, mixer);
         const SkColor result_color = color_utils::PickGoogleColor(
-            foreground_color, background_color, min_contrast);
+            foreground_color, background_color, min_contrast, max_contrast);
         DVLOG(2) << "ColorTransform PickGoogleColor:"
                  << " Input Color: " << SkColorName(input_color)
                  << " Foreground Color: " << SkColorName(foreground_color)
                  << " Background Color: " << SkColorName(background_color)
                  << " Min Contrast: " << base::NumberToString(min_contrast)
+                 << " Max Contrast: " << base::NumberToString(max_contrast)
                  << " Result Color: " << SkColorName(result_color);
         return result_color;
       };
   return base::BindRepeating(generator, std::move(foreground_transform),
-                             std::move(background_transform), min_contrast);
+                             std::move(background_transform), min_contrast,
+                             max_contrast);
 }
 
 ColorTransform PickGoogleColorTwoBackgrounds(
     ColorTransform foreground_transform,
     ColorTransform background_a_transform,
     ColorTransform background_b_transform,
-    float min_contrast) {
+    float min_contrast,
+    float max_contrast_against_nearer) {
   const auto generator = [](ui::ColorTransform foreground_transform,
                             ui::ColorTransform background_a_transform,
                             ui::ColorTransform background_b_transform,
-                            float min_contrast, SkColor input_color,
-                            const ui::ColorMixer& mixer) {
+                            float min_contrast,
+                            float max_contrast_against_nearer,
+                            SkColor input_color, const ui::ColorMixer& mixer) {
     const SkColor foreground_color =
         foreground_transform.Run(input_color, mixer);
     const SkColor background_a_color =
@@ -326,18 +331,22 @@
     const SkColor background_b_color =
         background_b_transform.Run(input_color, mixer);
     const SkColor result_color = color_utils::PickGoogleColorTwoBackgrounds(
-        foreground_color, background_a_color, background_b_color, min_contrast);
+        foreground_color, background_a_color, background_b_color, min_contrast,
+        max_contrast_against_nearer);
     DVLOG(2) << "ColorTransform PickGoogleColor:"
              << " Foreground Color: " << ui::SkColorName(foreground_color)
              << " Background Color A: " << ui::SkColorName(background_a_color)
              << " Background Color B: " << ui::SkColorName(background_b_color)
              << " Min Contrast: " << base::NumberToString(min_contrast)
+             << " Max Contrast Against Nearer: "
+             << base::NumberToString(max_contrast_against_nearer)
              << " Result Color: " << ui::SkColorName(result_color);
     return result_color;
   };
   return base::BindRepeating(generator, std::move(foreground_transform),
                              std::move(background_a_transform),
-                             std::move(background_b_transform), min_contrast);
+                             std::move(background_b_transform), min_contrast,
+                             max_contrast_against_nearer);
 }
 
 ColorTransform HSLShift(ColorTransform color, color_utils::HSL hsl) {
diff --git a/ui/color/color_transform.h b/ui/color/color_transform.h
index 62108d3..e5bce21 100644
--- a/ui/color/color_transform.h
+++ b/ui/color/color_transform.h
@@ -120,23 +120,45 @@
 
 // A transform that gets a Google color with a similar hue to the result of
 // `foreground_transform` and a similar contrast against the result of
-// `background_transform`, subject to being at least `min_contrast`. If the
-// result of `foreground_transform` isn't very saturated, grey will be used
-// instead.
+// `background_transform`, subject to being at least `min_contrast` and at most
+// `max_contrast`. If the result of `foreground_transform` isn't very saturated,
+// grey will be used instead.
+//
+// Each of the following constraints takes precedence over the ones below it.
+//   1. Ensure `min_contrast`, if possible, lest the UI become unreadable. If
+//      there are no sufficiently-contrasting colors of the desired hue, falls
+//      back to white/grey 900.
+//   2. Avoid returning a lighter color than the background if the input was
+//      darker, and vice versa. Inverting the relationship between foreground
+//      and background could look odd.
+//   3. Ensure `max_contrast`, if possible, lest some UI elements stick out too
+//      much.
+//   4. Adjust the relative luminance of the returned color as little as
+//      possible, to minimize distortion of the intended color.
+// Other than prioritizing (1), this order is subjective.
 COMPONENT_EXPORT(COLOR)
 ColorTransform PickGoogleColor(
     ColorTransform foreground_transform,
     ColorTransform background_transform = FromTransformInput(),
-    float min_contrast = 0.0f);
+    float min_contrast = 0.0f,
+    float max_contrast = color_utils::kMaximumPossibleContrast);
 
-// Like the version above, but attempts to contrast sufficiently against both
-// supplied backgrounds.
+// Like the version above, but the constraints are modified:
+//   1. Ensure `min_contrast`, if possible, with both backgrounds
+//      simultaneously.
+//   2. If the foreground is lighter than both backgrounds, make it lighter; if
+//      it's darker than both, make it darker; if it's between the two, keep it
+//      between.
+//   3. Ensure `max_contrast_with_nearer` against the lower-contrast ("nearer")
+//      background.
+//   4. Unchanged.
 COMPONENT_EXPORT(COLOR)
 ColorTransform PickGoogleColorTwoBackgrounds(
     ColorTransform foreground_transform,
     ColorTransform background_a_transform,
     ColorTransform background_b_transform,
-    float min_contrast);
+    float min_contrast,
+    float max_contrast_against_nearer = color_utils::kMaximumPossibleContrast);
 
 // A transform that returns the HSL shifted color given the input color.
 COMPONENT_EXPORT(COLOR)
diff --git a/ui/color/color_transform_unittest.cc b/ui/color/color_transform_unittest.cc
index c2b56ab0..1c4967c 100644
--- a/ui/color/color_transform_unittest.cc
+++ b/ui/color/color_transform_unittest.cc
@@ -229,5 +229,44 @@
     EXPECT_EQ(SkColorSetA(color, kAlpha), transform.Run(color, ColorMixer()));
 }
 
+// Tests that PickGoogleColor() produces a transform that picks a Google color
+// with appropriate contrast against the specified background.
+TEST(ColorTransformTest, PickGoogleColor) {
+  constexpr SkColor kBackground = gfx::kGoogleGrey600;
+  constexpr float kMinContrast = 2.1f;
+  const ColorTransform transform =
+      PickGoogleColor(FromTransformInput(), kBackground, kMinContrast);
+  EXPECT_EQ(gfx::kGoogleRed900, transform.Run(SK_ColorRED, ColorMixer()));
+  EXPECT_EQ(gfx::kGoogleGreen100, transform.Run(SK_ColorGREEN, ColorMixer()));
+  EXPECT_EQ(gfx::kGoogleBlue900, transform.Run(SK_ColorBLUE, ColorMixer()));
+}
+
+// Tests that PickGoogleColorTwoBackgrounds() produces a transform that picks a
+// Google color with appropriate contrast against both specified backgrounds.
+TEST(ColorTransformTest, PickGoogleColorTwoBackgrounds) {
+  constexpr SkColor kBackgroundA = gfx::kGoogleGrey800;
+  constexpr SkColor kBackgroundB = gfx::kGoogleGrey400;
+  constexpr float kMinContrast = 1.5f;
+  const ColorTransform transform = PickGoogleColorTwoBackgrounds(
+      FromTransformInput(), kBackgroundA, kBackgroundB, kMinContrast);
+  EXPECT_EQ(gfx::kGoogleRed500, transform.Run(SK_ColorRED, ColorMixer()));
+  EXPECT_EQ(gfx::kGoogleGreen050, transform.Run(SK_ColorGREEN, ColorMixer()));
+  EXPECT_EQ(gfx::kGoogleBlue800, transform.Run(SK_ColorBLUE, ColorMixer()));
+}
+
+// Tests that HSLShift() produces a transform that applies the given HSL shift
+// to the given input color.
+TEST(ColorTransformTest, HSLShift) {
+  constexpr color_utils::HSL kHsl = {0.2, 0.3, 0.4};
+  const ColorTransform transform = HSLShift(FromTransformInput(), kHsl);
+  const auto verify_color = [&](SkColor input) {
+    EXPECT_EQ(color_utils::HSLShift(input, kHsl),
+              transform.Run(input, ColorMixer()));
+  };
+  verify_color(SK_ColorBLACK);
+  verify_color(gfx::kGoogleGrey600);
+  verify_color(SK_ColorWHITE);
+}
+
 }  // namespace
 }  // namespace ui
diff --git a/ui/color/core_default_color_mixer.cc b/ui/color/core_default_color_mixer.cc
index 2765b62..1a04ef6 100644
--- a/ui/color/core_default_color_mixer.cc
+++ b/ui/color/core_default_color_mixer.cc
@@ -27,16 +27,20 @@
            << (dark_mode ? "Dark" : "Light") << " window.";
   ColorMixer& mixer = provider->AddMixer();
   mixer[kColorAccent] = {dark_mode ? gfx::kGoogleBlue300 : gfx::kGoogleBlue600};
-  // 4.5 matches the default light theme contrast of
+  // 4.5 and 7.0 approximate the default light and dark theme contrasts of
   // accent-against-primary-background.
   mixer[kColorAccentWithGuaranteedContrastAtopPrimaryBackground] =
-      PickGoogleColor(kColorAccent, kColorPrimaryBackground, 4.5f);
+      PickGoogleColor(kColorAccent, kColorPrimaryBackground, 4.5f, 7.0f);
   mixer[kColorAlertHighSeverity] = {dark_mode ? gfx::kGoogleRed300
                                               : gfx::kGoogleRed600};
   mixer[kColorAlertLowSeverity] = {dark_mode ? gfx::kGoogleGreen300
                                              : gfx::kGoogleGreen700};
-  mixer[kColorAlertMediumSeverity] = {dark_mode ? gfx::kGoogleYellow300
-                                                : gfx::kGoogleYellow700};
+  mixer[kColorAlertMediumSeverityIcon] = {dark_mode ? gfx::kGoogleYellow300
+                                                    : gfx::kGoogleYellow700};
+  // Color used for alert text should more readable than the color above which
+  // is for icons.
+  mixer[kColorAlertMediumSeverityText] = {dark_mode ? gfx::kGoogleYellow300
+                                                    : gfx::kGoogleOrange900};
   mixer[kColorDisabledForeground] =
       PickGoogleColor(gfx::kGoogleGrey600, kColorPrimaryBackground,
                       color_utils::kMinimumReadableContrastRatio);
@@ -46,7 +50,7 @@
       GetColorWithMaxContrast(kColorPrimaryBackground);
   mixer[kColorItemHighlight] =
       PickGoogleColor(kColorAccent, kColorPrimaryBackground,
-                      color_utils::kMinimumVisibleContrastRatio);
+                      color_utils::kMinimumVisibleContrastRatio, 5.0f);
   mixer[kColorItemSelectionBackground] =
       AlphaBlend(kColorAccentWithGuaranteedContrastAtopPrimaryBackground,
                  kColorPrimaryBackground, 0x3C);
diff --git a/ui/color/material_ui_color_mixer.cc b/ui/color/material_ui_color_mixer.cc
index 0e3b2700..6ce94b9 100644
--- a/ui/color/material_ui_color_mixer.cc
+++ b/ui/color/material_ui_color_mixer.cc
@@ -43,7 +43,7 @@
   mixer[kColorCheckboxBackgroundDisabled] = {kColorSysStateDisabledContainer};
   mixer[kColorCheckboxForegroundChecked] = {kColorSysOnSurfacePrimary};
   mixer[kColorCheckboxForegroundDisabled] = {kColorSysStateDisabled};
-  mixer[kColorCheckboxForegroundUnchecked] = {kColorSysOnSurfaceVariant};
+  mixer[kColorCheckboxForegroundUnchecked] = {kColorSysOutline};
   mixer[kColorComboboxBackground] = {kColorSysSurface};
   mixer[kColorComboboxBackgroundDisabled] = {GetResultingPaintColor(
       {kColorSysStateDisabledContainer}, {kColorComboboxBackground})};
diff --git a/ui/color/win/native_color_mixers_win.cc b/ui/color/win/native_color_mixers_win.cc
index 1c9c2a7..9003a51 100644
--- a/ui/color/win/native_color_mixers_win.cc
+++ b/ui/color/win/native_color_mixers_win.cc
@@ -88,7 +88,8 @@
 
   // Window Text
   mixer[kColorAlertLowSeverity] = {kColorNativeWindowText};
-  mixer[kColorAlertMediumSeverity] = {kColorNativeWindowText};
+  mixer[kColorAlertMediumSeverityIcon] = {kColorNativeWindowText};
+  mixer[kColorAlertMediumSeverityText] = {kColorNativeWindowText};
   mixer[kColorAlertHighSeverity] = {kColorNativeWindowText};
   mixer[kColorIcon] = {kColorNativeWindowText};
   mixer[kColorMidground] = {kColorNativeWindowText};
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc
index 5926906d..8796a61 100644
--- a/ui/gfx/color_utils.cc
+++ b/ui/gfx/color_utils.cc
@@ -9,10 +9,12 @@
 #include <algorithm>
 #include <cmath>
 #include <ostream>
+#include <vector>
 
 #include "base/check_op.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "build/build_config.h"
@@ -139,20 +141,26 @@
                         SkColor color,
                         SkColor background_color_a,
                         SkColor background_color_b,
-                        float min_contrast) {
-  // Compute source color, the color in `colors` which is closest to `color`.
+                        float min_contrast,
+                        float max_contrast_with_nearer) {
+  // Sanity checks.
+  DCHECK_GT(kNumGoogleColors, 0u);
+  DCHECK_GE(min_contrast, 0.0f);
+  DCHECK_LE(min_contrast, max_contrast_with_nearer);
+
   // First set up `lum_colors`, the corresponding relative luminances of
   // `colors`.  These could be precomputed and recorded next to `kGrey` etc. for
   // some runtime speedup at the cost of maintenance pain.
   float lum_colors[kNumGoogleColors];
-  std::transform(std::cbegin(colors), std::cend(colors), std::begin(lum_colors),
-                 &GetRelativeLuminance);
+  base::ranges::transform(colors, std::begin(lum_colors),
+                          &GetRelativeLuminance);
+
   // This function returns an iterator to the least-contrasting luminance (in
   // `lum_colors`) to `lum`.
   const auto find_nearest_lum_it = [&lum_colors](float lum) {
     // Find the first luminance (since they're sorted decreasing) <= `lum`.
-    const auto* it = std::lower_bound(
-        std::cbegin(lum_colors), std::cend(lum_colors), lum, std::greater<>());
+    const float* it =
+        base::ranges::lower_bound(lum_colors, lum, base::ranges::greater());
     // If applicable, check against the next greater luminance for whichever is
     // lower-contrast.
     if (it == std::cend(lum_colors) ||
@@ -162,70 +170,141 @@
     }
     return it;
   };
-  const auto* const src_it = find_nearest_lum_it(GetRelativeLuminance(color));
 
-  // Compute target color, the color in `colors` which maximizes simultaneous
-  // contrast against both backgrounds, i.e. maximizes the minimum of the
-  // contrasts with both.
-  // Skip various unnecessary calculations in the common case that there is
-  // really only one background color to contrast with.
+  // Compute `src_it`, the element in `lum_colors` which is closest to `color`.
+  const float* src_it = find_nearest_lum_it(GetRelativeLuminance(color));
+
+  // Compute the background luminances.
   const bool one_bg = background_color_a == background_color_b;
   const float lum_a = GetRelativeLuminance(background_color_a);
   const float lum_b = one_bg ? lum_a : GetRelativeLuminance(background_color_b);
-  // `lum_mid` is a relative luminance between `lum_a` and `lum_b` that
-  // contrasts equally with both.
+
+  // Compute `lum_mid`, the luminance between `lum_a` and `lum_b` that contrasts
+  // equally with both.
   const float lum_mid =
       one_bg ? lum_a : (std::sqrt((lum_a + 0.05f) * (lum_b + 0.05f)) - 0.05f);
-  // Of the two luminance endpoints, choose the one that contrasts more with
-  // `lum_mid`, as this maximizes the contrast against both backgrounds.  When
-  // there is only one background color, this is the target color.
-  const auto* targ_it = (lum_mid < g_luminance_midpoint)
-                            ? std::cbegin(lum_colors)
-                            : (std::cend(lum_colors) - 1);
+
   // This function returns the luminance of whichever background contrasts less
-  // with `lum`.
+  // with some given luminance (the "nearer background").
   const auto bg_lum_near_lum = [&](float lum) {
     return ((lum_a > lum_b) == (lum > lum_mid)) ? lum_a : lum_b;
   };
-  if (!one_bg) {
-    // The most-contrasting color, and thus target, is either the closest color
-    // to `lum_mid` (if the backgrounds are near both endpoints) or the
-    // previously-selected endpoint.  Compare their minimum contrasts.
-    const auto* const mid_it = find_nearest_lum_it(lum_mid);
-    if (GetContrastRatio(bg_lum_near_lum(*mid_it), *mid_it) >
-        GetContrastRatio(bg_lum_near_lum(*targ_it), *targ_it)) {
-      targ_it = mid_it;
+
+  // Compute the contrast of `src_it` against the nearer background.
+  const float nearer_bg_lum = bg_lum_near_lum(*src_it);
+  const float src_contrast_with_near = GetContrastRatio(*src_it, nearer_bg_lum);
+
+  // This function returns the first element E, moving from `begin` towards
+  // `end` (inclusive), which does not satisfy `comp(proj(E), threshold)`. In
+  // other words, this is basically a direction-agnostic lower_bound().
+  const auto first_across_threshold = [&](const float* begin, const float* end,
+                                          float threshold, auto comp,
+                                          auto proj) {
+    if (end >= begin) {
+      return base::ranges::lower_bound(begin, end, threshold, comp, proj);
     }
+    const auto res_it_reversed = base::ranges::lower_bound(
+        std::make_reverse_iterator(begin + 1),
+        std::make_reverse_iterator(end + 1), threshold, comp, proj);
+    return res_it_reversed.base() - 1;
+  };
+
+  // Compute `res_it`, the desired result element in `lum_colors`. Start with
+  // `src_it`, then adjust depending on the contrast against the nearer
+  // background.
+  const float* res_it = src_it;
+  if (src_contrast_with_near < min_contrast) {
+    // Need to increase contrast. This will be done by iterating through
+    // `lum_colors` towards a target element with sufficient contrast. The three
+    // potential targets are the two endpoints and (if there are two
+    // backgrounds) the element nearest `lum_mid`.
+    std::vector<const float*> targets = {std::cbegin(lum_colors),
+                                         std::cend(lum_colors) - 1};
+    const bool src_darker_than_bg_a = *src_it < lum_a;
+    if (one_bg) {
+      // To avoid inverting the relationship between source and background,
+      // prefer the endpoint on the "same side" of the background as the source,
+      // then the other endpoint.
+      if (src_darker_than_bg_a) {
+        std::swap(targets[0], targets[1]);
+      }
+    } else if (src_darker_than_bg_a == (*src_it < lum_b)) {
+      // The source is either lighter or darker than both backgrounds, so prefer
+      // the endpoint on the "same side", then the midpoint, then the other
+      // endpoint.
+      if (src_darker_than_bg_a) {
+        std::swap(targets[0], targets[1]);
+      }
+      targets.insert(targets.cbegin() + 1, find_nearest_lum_it(lum_mid));
+    } else {
+      // The source is between the two backgrounds, so prefer the midpoint, then
+      // the endpoint on the "same side" of the midpoint as the source, then the
+      // other endpoint.
+      if (*src_it < lum_mid) {
+        std::swap(targets[0], targets[1]);
+      }
+      targets.insert(targets.cbegin(), find_nearest_lum_it(lum_mid));
+    }
+
+    // Set `targ_it` to the first target in the priority list that has at least
+    // `min_contrast` against the nearer background. If none of the targets meet
+    // the contrast threshold, use the one with the best contrast.
+    const float* targ_it;
+    float best_contrast = 0;
+    const auto proj = [&](float lum) {
+      return GetContrastRatio(lum, bg_lum_near_lum(lum));
+    };
+    for (const float* elem : targets) {
+      const float contrast = proj(*elem);
+      if (contrast > best_contrast) {
+        targ_it = elem;
+        best_contrast = contrast;
+        if (best_contrast >= min_contrast) {
+          break;
+        }
+      }
+    }
+
+    if (best_contrast < min_contrast) {
+      // Couldn't meet the threshold, so `targ_it` is the best possible result.
+      res_it = targ_it;
+    } else {
+      // `targ_it` has sufficient contrast. Since `src_it` is already known to
+      // have insufficient contrast, move it one step towards `targ_it`.
+      src_it = (targ_it < src_it) ? (src_it - 1) : (src_it + 1);
+
+      // Now keep moving towards `targ_it` until contrast is sufficient.
+      res_it = first_across_threshold(src_it, targ_it, min_contrast,
+                                      base::ranges::less(), proj);
+    }
+  } else if (src_contrast_with_near > max_contrast_with_nearer) {
+    // Need to reduce contrast if possible by moving toward the nearer
+    // background. Compute `targ_it`, the element in `lum_colors` whose
+    // luminance is closest to the nearer background while staying on the "same
+    // side" as `src_it`. (This intentionally allows `targ_it` to match the
+    // nearer background's luminance exactly, in case `min_contrast == 0`.)
+    const auto* targ_it =
+        (*src_it > nearer_bg_lum)
+            ? (std::upper_bound(src_it, std::cend(lum_colors), nearer_bg_lum,
+                                std::greater<>()) -
+               1)
+            : std::lower_bound(std::cbegin(lum_colors), src_it, nearer_bg_lum,
+                               std::greater<>());
+
+    // Ensure `targ_it` reaches `min_contrast` against the nearer background by
+    // moving toward `src_it`.
+    const auto proj = [&](float lum) {
+      return GetContrastRatio(lum, nearer_bg_lum);
+    };
+    targ_it = first_across_threshold(targ_it, src_it, min_contrast,
+                                     base::ranges::less(), proj);
+
+    // Now move `res_it` towards `targ_it` until contrast is sufficiently low.
+    res_it = first_across_threshold(src_it, targ_it, max_contrast_with_nearer,
+                                    base::ranges::greater(), proj);
   }
 
-  // Find first color between source and target, inclusive, for which contrast
-  // reaches `min_contrast` threshold.
-  const auto* res_it = src_it;
-  // This function returns whether the minimum contrast of `lum` against the
-  // backgrounds is underneath the threshold `con`.
-  const auto comp = [&](float lum, float con) {
-    const float lum_near = bg_lum_near_lum(lum);
-    return GetContrastRatio(lum, lum_near) < con;
-  };
-  // Depending on how the colors are arranged, the source may have sufficient
-  // contrast against both backgrounds while some subsequent colors do not.  In
-  // this case we can return immediately.
-  if ((src_it != targ_it) && comp(*src_it, min_contrast)) {
-    // The source does not have sufficient contrast, which means the range of
-    // `lum_colors` we care about is partitioned into a set that contrasts
-    // insufficiently followed by a (possibly-empty) set that contrasts
-    // sufficiently.  Use std::lower_bound() to find the first element of the
-    // latter set (or, if that set is empty, the last element of the former).
-    if (targ_it < src_it) {
-      // Reverse iterate over [src_it - 1, targ_it).
-      const auto res_it_reversed = std::lower_bound(
-          std::make_reverse_iterator(src_it),
-          std::make_reverse_iterator(targ_it + 1), min_contrast, comp);
-      res_it = res_it_reversed.base() - 1;
-    } else {
-      res_it = std::lower_bound(src_it + 1, targ_it, min_contrast, comp);
-    }
-  }
+  // Convert `res_it` back to a color.
   return colors[res_it - std::begin(lum_colors)];
 }
 
@@ -284,10 +363,11 @@
 
 SkColor PickGoogleColor(SkColor color,
                         SkColor background_color,
-                        float min_contrast) {
+                        float min_contrast,
+                        float max_contrast) {
   const auto pick_color = [&](const SkColor(&colors)[kNumGoogleColors]) {
     return PickGoogleColor(colors, color, background_color, background_color,
-                           min_contrast);
+                           min_contrast, max_contrast);
   };
   return PickGoogleColorImpl(color, pick_color);
 }
@@ -295,10 +375,12 @@
 SkColor PickGoogleColorTwoBackgrounds(SkColor color,
                                       SkColor background_color_a,
                                       SkColor background_color_b,
-                                      float min_contrast) {
+                                      float min_contrast,
+                                      float max_contrast_with_nearer) {
   const auto pick_color = [&](const SkColor(&colors)[kNumGoogleColors]) {
     return PickGoogleColor(colors, color, background_color_a,
-                           background_color_b, min_contrast);
+                           background_color_b, min_contrast,
+                           max_contrast_with_nearer);
   };
   return PickGoogleColorImpl(color, pick_color);
 }
diff --git a/ui/gfx/color_utils.h b/ui/gfx/color_utils.h
index 98f139f..5677c2c 100644
--- a/ui/gfx/color_utils.h
+++ b/ui/gfx/color_utils.h
@@ -28,6 +28,9 @@
   SkColor color;
 };
 
+// The maximum contrast that can be achieved (i.e. white against black).
+constexpr float kMaximumPossibleContrast = 21.0f;
+
 // The minimum contrast between text and background that is still readable.
 // This value is taken from w3c accessibility guidelines.
 constexpr float kMinimumReadableContrastRatio = 4.5f;
@@ -160,21 +163,44 @@
 // surface.
 GFX_EXPORT SkColor DeriveDefaultIconColor(SkColor text_color);
 
-// Gets a Google color that matches the hue of `color` and contrasts similarly
-// against `background_color`, subject to being at least `min_contrast`. If
-// `color` isn't very saturated, grey will be used instead.  Even if `color` is
-// saturated, if there are no sufficiently-contrasting colors of a matching hue,
-// will fall back to white/grey 900.
-GFX_EXPORT SkColor PickGoogleColor(SkColor color,
-                                   SkColor background_color,
-                                   float min_contrast);
+// Gets a Google color with a similar hue to `color` and a similar contrast
+// against `background_color`, subject to being at least `min_contrast` and at
+// most `max_contrast`. If `color` isn't very saturated, grey will be used
+// instead.
+//
+// Each of the following constraints takes precedence over the ones below it.
+//   1. Ensure `min_contrast`, if possible, lest the UI become unreadable. If
+//      there are no sufficiently-contrasting colors of the desired hue, falls
+//      back to white/grey 900.
+//   2. Avoid returning a lighter color than the background if the input was
+//      darker, and vice versa. Inverting the relationship between `color` and
+//      `background_color` could look odd.
+//   3. Ensure `max_contrast`, if possible, lest some UI elements stick out too
+//      much.
+//   4. Adjust the relative luminance of the returned color as little as
+//      possible, to minimize distortion of the intended color.
+// Other than prioritizing (1), this order is subjective.
+GFX_EXPORT SkColor
+PickGoogleColor(SkColor color,
+                SkColor background_color,
+                float min_contrast,
+                float max_contrast = kMaximumPossibleContrast);
 
-// Like the version above, but tries to contrast sufficiently with both
-// `background_color_a` and `background_color_b` simultaneously.
-GFX_EXPORT SkColor PickGoogleColorTwoBackgrounds(SkColor color,
-                                                 SkColor background_color_a,
-                                                 SkColor background_color_b,
-                                                 float min_contrast);
+// Like the version above, but the constraints are modified:
+//   1. Ensure `min_contrast`, if possible, with both backgrounds
+//      simultaneously.
+//   2. If the input is lighter than both backgrounds, make it lighter; if it's
+//      darker than both, make it darker; if it's between the two, keep it
+//      between.
+//   3. Ensure `max_contrast_with_nearer` against the lower-contrast ("nearer")
+//      background.
+//   4. Unchanged.
+GFX_EXPORT SkColor PickGoogleColorTwoBackgrounds(
+    SkColor color,
+    SkColor background_color_a,
+    SkColor background_color_b,
+    float min_contrast,
+    float max_contrast_with_nearer = kMaximumPossibleContrast);
 
 // Creates an rgba string for an SkColor. For example: 'rgba(255,0,255,0.5)'.
 GFX_EXPORT std::string SkColorToRgbaString(SkColor color);
diff --git a/ui/gfx/color_utils_unittest.cc b/ui/gfx/color_utils_unittest.cc
index 4dba007..0f2d571 100644
--- a/ui/gfx/color_utils_unittest.cc
+++ b/ui/gfx/color_utils_unittest.cc
@@ -309,4 +309,124 @@
   EXPECT_EQ(color, result.color);
 }
 
+TEST(ColorUtils, PickGoogleColor) {
+  // If the input color already has sufficient contrast, it should be accepted.
+  EXPECT_EQ(gfx::kGoogleBlue800,
+            PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700, 1.1f));
+  EXPECT_EQ(gfx::kGoogleBlue600,
+            PickGoogleColor(gfx::kGoogleBlue600, gfx::kGoogleBlue700, 1.1f));
+
+  // If it does not, it should stay on the same side of the background if
+  // possible.
+  EXPECT_EQ(gfx::kGoogleBlue900,
+            PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700, 1.25f));
+  EXPECT_EQ(gfx::kGoogleBlue500,
+            PickGoogleColor(gfx::kGoogleBlue600, gfx::kGoogleBlue700, 1.25f));
+
+  // If even Blue 900 does not contrast enough, Grey 900 is a slightly darker
+  // color.
+  EXPECT_EQ(gfx::kGoogleGrey900,
+            PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700, 1.5f));
+
+  // If no dark colors have enough contrast, the result should be a lighter
+  // color instead.
+  EXPECT_EQ(gfx::kGoogleBlue200,
+            PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700, 3.0f));
+
+  // If the requested contrast is too high for any color to be sufficient, the
+  // result should be the most-contrasting endpoint.
+  EXPECT_EQ(SK_ColorWHITE,
+            PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                            kMaximumPossibleContrast));
+
+  // Matching the background exactly is reasonable, if the minimum contrast is
+  // zero.
+  EXPECT_EQ(
+      gfx::kGoogleBlue700,
+      PickGoogleColor(gfx::kGoogleBlue800, gfx::kGoogleBlue700, 0.0f, 1.2f));
+
+  // Blue 600 is the only color that fits in the requested contrast window, but
+  // it's on the other side of the background from the input, so something
+  // closer to the input is used instead.
+  EXPECT_EQ(
+      gfx::kGoogleBlue800,
+      PickGoogleColor(gfx::kGoogleBlue900, gfx::kGoogleBlue700, 1.18f, 1.2f));
+}
+
+TEST(ColorUtils, PickGoogleColorTwoBackgrounds) {
+  // If the input color already has sufficient contrast, it should be accepted.
+  EXPECT_EQ(gfx::kGoogleBlue800, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.1f));
+  EXPECT_EQ(gfx::kGoogleBlue600, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue600, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.1f));
+  EXPECT_EQ(gfx::kGoogleBlue300, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue300, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.1f));
+  EXPECT_EQ(gfx::kGoogleBlue100, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue100, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.1f));
+
+  // If it does not, it should stay on the same side of the background if
+  // possible.
+  EXPECT_EQ(gfx::kGoogleBlue900, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.25f));
+  EXPECT_EQ(gfx::kGoogleBlue500, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue600, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.25f));
+  EXPECT_EQ(gfx::kGoogleBlue400, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue300, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.3f));
+  EXPECT_EQ(gfx::kGoogleBlue050, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue100, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.3f));
+
+  // If the blue endpoints do not contrast enough, the grey endpoints are
+  // available.
+  EXPECT_EQ(gfx::kGoogleGrey900, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue200, 1.5f));
+  EXPECT_EQ(SK_ColorWHITE, PickGoogleColorTwoBackgrounds(
+                               gfx::kGoogleBlue100, gfx::kGoogleBlue700,
+                               gfx::kGoogleBlue200, 1.5f));
+
+  // If it's not possible to achieve sufficient contrast on the same side of the
+  // background, then the result color should cross to the other side.
+  EXPECT_EQ(gfx::kGoogleBlue500, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue100, gfx::kGoogleBlue200,
+                                     gfx::kGoogleBlue900, 1.7f));
+  EXPECT_EQ(gfx::kGoogleBlue100, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue600, 3.0f));
+
+  // If the requested contrast is too high for any color to be sufficient, the
+  // result should be the most-contrasting point.
+  EXPECT_EQ(SK_ColorWHITE, PickGoogleColorTwoBackgrounds(
+                               gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                               gfx::kGoogleBlue600, kMaximumPossibleContrast));
+  EXPECT_EQ(gfx::kGoogleGrey900,
+            PickGoogleColorTwoBackgrounds(
+                gfx::kGoogleBlue100, gfx::kGoogleBlue200, gfx::kGoogleBlue300,
+                kMaximumPossibleContrast));
+  EXPECT_EQ(gfx::kGoogleBlue400,
+            PickGoogleColorTwoBackgrounds(
+                gfx::kGoogleBlue100, gfx::kGoogleBlue900, gfx::kGoogleBlue050,
+                kMaximumPossibleContrast));
+
+  // Matching the background exactly is reasonable, if the minimum contrast is
+  // zero.
+  EXPECT_EQ(gfx::kGoogleBlue700, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue800, gfx::kGoogleBlue700,
+                                     gfx::kGoogleBlue600, 0.0f, 1.2f));
+
+  // Blue 600 is the only color that fits in the requested contrast window, but
+  // it's on the other side of the background from the input, so something
+  // closer to the input is used instead.
+  EXPECT_EQ(gfx::kGoogleBlue800, PickGoogleColorTwoBackgrounds(
+                                     gfx::kGoogleBlue900, gfx::kGoogleBlue700,
+                                     gfx ::kGoogleBlue500, 1.18f, 1.2f));
+}
+
 }  // namespace color_utils
diff --git a/ui/gtk/gtk_color_mixers.cc b/ui/gtk/gtk_color_mixers.cc
index 7f4ed33..e507140 100644
--- a/ui/gtk/gtk_color_mixers.cc
+++ b/ui/gtk/gtk_color_mixers.cc
@@ -56,9 +56,12 @@
       ui::kColorPrimaryBackground, gfx::kGoogleRed300, gfx::kGoogleRed600)};
   mixer[ui::kColorAlertLowSeverity] = {SelectBasedOnDarkInput(
       ui::kColorPrimaryBackground, gfx::kGoogleGreen300, gfx::kGoogleGreen700)};
-  mixer[ui::kColorAlertMediumSeverity] = {
+  mixer[ui::kColorAlertMediumSeverityIcon] = {
       SelectBasedOnDarkInput(ui::kColorPrimaryBackground, gfx::kGoogleYellow300,
                              gfx::kGoogleYellow700)};
+  mixer[ui::kColorAlertMediumSeverityText] = {
+      SelectBasedOnDarkInput(ui::kColorPrimaryBackground, gfx::kGoogleYellow300,
+                             gfx::kGoogleOrange900)};
   mixer[ui::kColorDisabledForeground] = {label_fg_disabled};
   mixer[ui::kColorItemHighlight] = {GetBorderColor("entry:focus")};
   mixer[ui::kColorItemSelectionBackground] = {ui::kColorAccent};
diff --git a/ui/ozone/platform/wayland/test/test_data_device.cc b/ui/ozone/platform/wayland/test/test_data_device.cc
index 213a144..027a99b 100644
--- a/ui/ozone/platform/wayland/test/test_data_device.cc
+++ b/ui/ozone/platform/wayland/test/test_data_device.cc
@@ -7,6 +7,7 @@
 #include <wayland-server-core.h>
 
 #include <cstdint>
+#include <memory>
 
 #include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
@@ -66,8 +67,6 @@
                                   selection_offer->resource());
   }
 
-  void OnDestroying() override { delete this; }
-
  private:
   const raw_ptr<TestDataDevice> device_;
 };
@@ -80,7 +79,7 @@
 
 TestDataDevice::TestDataDevice(wl_resource* resource,
                                TestDataDeviceManager* manager)
-    : TestSelectionDevice(resource, new WlDataDeviceImpl(this)),
+    : TestSelectionDevice(resource, std::make_unique<WlDataDeviceImpl>(this)),
       manager_(manager) {}
 
 TestDataDevice::~TestDataDevice() = default;
diff --git a/ui/ozone/platform/wayland/test/test_data_offer.cc b/ui/ozone/platform/wayland/test/test_data_offer.cc
index 4f2ffe1..d6b565a 100644
--- a/ui/ozone/platform/wayland/test/test_data_offer.cc
+++ b/ui/ozone/platform/wayland/test/test_data_offer.cc
@@ -50,8 +50,6 @@
     wl_data_offer_send_offer(offer_->resource(), mime_type.c_str());
   }
 
-  void OnDestroying() override { delete this; }
-
  private:
   const raw_ptr<TestDataOffer> offer_;
 };
@@ -63,7 +61,7 @@
     DataOfferFinish, DataOfferSetActions};
 
 TestDataOffer::TestDataOffer(wl_resource* resource)
-    : TestSelectionOffer(resource, new WlDataOfferImpl(this)) {}
+    : TestSelectionOffer(resource, std::make_unique<WlDataOfferImpl>(this)) {}
 
 TestDataOffer::~TestDataOffer() = default;
 
diff --git a/ui/ozone/platform/wayland/test/test_data_source.cc b/ui/ozone/platform/wayland/test/test_data_source.cc
index 3f15b58..b366707f 100644
--- a/ui/ozone/platform/wayland/test/test_data_source.cc
+++ b/ui/ozone/platform/wayland/test/test_data_source.cc
@@ -6,6 +6,7 @@
 
 #include <wayland-server-core.h>
 
+#include <memory>
 #include <string>
 
 #include "base/logging.h"
@@ -56,8 +57,6 @@
     wl_client_flush(wl_resource_get_client(source_->resource()));
   }
 
-  void OnDestroying() override { delete this; }
-
  private:
   const raw_ptr<TestDataSource> source_;
 };
@@ -68,7 +67,7 @@
     TestSelectionSource::Offer, DataSourceDestroy, DataSourceSetActions};
 
 TestDataSource::TestDataSource(wl_resource* resource)
-    : TestSelectionSource(resource, new WlDataSourceImpl(this)) {}
+    : TestSelectionSource(resource, std::make_unique<WlDataSourceImpl>(this)) {}
 
 TestDataSource::~TestDataSource() = default;
 
diff --git a/ui/ozone/platform/wayland/test/test_gtk_primary_selection.cc b/ui/ozone/platform/wayland/test/test_gtk_primary_selection.cc
index d93a1f7..0c6a2d61 100644
--- a/ui/ozone/platform/wayland/test/test_gtk_primary_selection.cc
+++ b/ui/ozone/platform/wayland/test/test_gtk_primary_selection.cc
@@ -8,6 +8,7 @@
 #include <wayland-server-core.h>
 
 #include <cstdint>
+#include <memory>
 
 #include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
@@ -32,8 +33,6 @@
                                            mime_type.c_str());
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionOffer> offer = nullptr;
 };
 
@@ -43,13 +42,13 @@
         &TestSelectionOffer::Receive, &Destroy};
     wl_resource* device_resource = device->resource();
     const int version = wl_resource_get_version(device_resource);
-    auto* delegate = new GtkPrimarySelectionOffer;
-
+    auto owned_delegate = std::make_unique<GtkPrimarySelectionOffer>();
+    auto* delegate = owned_delegate.get();
     wl_resource* new_offer_resource =
         CreateResourceWithImpl<TestSelectionOffer>(
             wl_resource_get_client(device->resource()),
             &gtk_primary_selection_offer_interface, version, &kOfferImpl, 0,
-            delegate);
+            std::move(owned_delegate));
     delegate->offer = GetUserDataAs<TestSelectionOffer>(new_offer_resource);
     gtk_primary_selection_device_send_data_offer(device_resource,
                                                  new_offer_resource);
@@ -67,8 +66,6 @@
     NOTIMPLEMENTED();
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionDevice> device = nullptr;
 };
 
@@ -92,8 +89,6 @@
     NOTREACHED() << "The interface does not support this method.";
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionSource> source = nullptr;
 };
 
@@ -107,10 +102,11 @@
     static const struct gtk_primary_selection_device_interface
         kTestSelectionDeviceImpl = {&TestSelectionDevice::SetSelection,
                                     &Destroy};
-    auto* delegate = new GtkPrimarySelectionDevice;
+    auto owned_delegate = std::make_unique<GtkPrimarySelectionDevice>();
+    auto* delegate = owned_delegate.get();
     wl_resource* resource = CreateResourceWithImpl<TestSelectionDevice>(
         client, &gtk_primary_selection_device_interface, version_,
-        &kTestSelectionDeviceImpl, id, delegate);
+        &kTestSelectionDeviceImpl, id, std::move(owned_delegate));
     delegate->device = GetUserDataAs<TestSelectionDevice>(resource);
     return delegate->device;
   }
@@ -118,23 +114,22 @@
   TestSelectionSource* CreateSource(wl_client* client, uint32_t id) override {
     static const struct gtk_primary_selection_source_interface
         kTestSelectionSourceImpl = {&TestSelectionSource::Offer, &Destroy};
-    auto* delegate = new GtkPrimarySelectionSource;
+    auto owned_delegate = std::make_unique<GtkPrimarySelectionSource>();
+    auto* delegate = owned_delegate.get();
     wl_resource* resource = CreateResourceWithImpl<TestSelectionSource>(
         client, &gtk_primary_selection_source_interface, version_,
-        &kTestSelectionSourceImpl, id, delegate);
+        &kTestSelectionSourceImpl, id, std::move(owned_delegate));
     delegate->source = GetUserDataAs<TestSelectionSource>(resource);
     return delegate->source;
   }
 
-  void OnDestroying() override { delete this; }
-
  private:
   const uint32_t version_;
 };
 
 }  // namespace
 
-TestSelectionDeviceManager* CreateTestSelectionManagerGtk() {
+std::unique_ptr<TestSelectionDeviceManager> CreateTestSelectionManagerGtk() {
   constexpr uint32_t kVersion = 1;
   static const struct gtk_primary_selection_device_manager_interface
       kTestSelectionManagerImpl = {&TestSelectionDeviceManager::CreateSource,
@@ -144,8 +139,9 @@
       .interface = &gtk_primary_selection_device_manager_interface,
       .implementation = &kTestSelectionManagerImpl,
       .version = kVersion};
-  return new TestSelectionDeviceManager(
-      interface_info, new GtkPrimarySelectionDeviceManager(kVersion));
+  return std::make_unique<TestSelectionDeviceManager>(
+      interface_info,
+      std::make_unique<GtkPrimarySelectionDeviceManager>(kVersion));
 }
 
 }  // namespace wl
diff --git a/ui/ozone/platform/wayland/test/test_gtk_primary_selection.h b/ui/ozone/platform/wayland/test/test_gtk_primary_selection.h
index d0d9f38a1..7b8c4b4a 100644
--- a/ui/ozone/platform/wayland/test/test_gtk_primary_selection.h
+++ b/ui/ozone/platform/wayland/test/test_gtk_primary_selection.h
@@ -5,12 +5,13 @@
 #ifndef UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_GTK_PRIMARY_SELECTION_H_
 #define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_GTK_PRIMARY_SELECTION_H_
 
+#include <memory>
+
 #include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
 
 namespace wl {
 
-TestSelectionDeviceManager* CreateTestSelectionManagerGtk();
-
+std::unique_ptr<TestSelectionDeviceManager> CreateTestSelectionManagerGtk();
 }
 
 #endif  // UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_GTK_PRIMARY_SELECTION_H_
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
index e206a8955..bcf9cf7 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
@@ -7,6 +7,7 @@
 #include <wayland-server-core.h>
 
 #include <cstdint>
+#include <utility>
 #include <vector>
 
 #include "base/check.h"
@@ -54,15 +55,13 @@
 
 // TestSelectionOffer implementation.
 TestSelectionOffer::TestSelectionOffer(wl_resource* resource,
-                                       Delegate* delegate)
+                                       std::unique_ptr<Delegate> delegate)
     : ServerObject(resource),
-      delegate_(delegate),
+      delegate_(std::move(delegate)),
       task_runner_(
           base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})) {}
 
-TestSelectionOffer::~TestSelectionOffer() {
-  delegate_->OnDestroying();
-}
+TestSelectionOffer::~TestSelectionOffer() = default;
 
 void TestSelectionOffer::OnOffer(const std::string& mime_type,
                                  ui::PlatformClipboard::Data data) {
@@ -83,15 +82,13 @@
 
 // TestSelectionSource implementation.
 TestSelectionSource::TestSelectionSource(wl_resource* resource,
-                                         Delegate* delegate)
+                                         std::unique_ptr<Delegate> delegate)
     : ServerObject(resource),
-      delegate_(delegate),
+      delegate_(std::move(delegate)),
       task_runner_(
           base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})) {}
 
-TestSelectionSource::~TestSelectionSource() {
-  delegate_->OnDestroying();
-}
+TestSelectionSource::~TestSelectionSource() = default;
 
 void TestSelectionSource::ReadData(const std::string& mime_type,
                                    ReadDataCallback callback) {
@@ -134,12 +131,10 @@
 
 // TestSelectionDevice implementation.
 TestSelectionDevice::TestSelectionDevice(wl_resource* resource,
-                                         Delegate* delegate)
-    : ServerObject(resource), delegate_(delegate) {}
+                                         std::unique_ptr<Delegate> delegate)
+    : ServerObject(resource), delegate_(std::move(delegate)) {}
 
-TestSelectionDevice::~TestSelectionDevice() {
-  delegate_->OnDestroying();
-}
+TestSelectionDevice::~TestSelectionDevice() = default;
 
 TestSelectionOffer* TestSelectionDevice::OnDataOffer() {
   return delegate_->CreateAndSendOffer();
@@ -164,13 +159,11 @@
 
 TestSelectionDeviceManager::TestSelectionDeviceManager(
     const InterfaceInfo& info,
-    Delegate* delegate)
+    std::unique_ptr<Delegate> delegate)
     : GlobalObject(info.interface, info.implementation, info.version),
-      delegate_(delegate) {}
+      delegate_(std::move(delegate)) {}
 
-TestSelectionDeviceManager::~TestSelectionDeviceManager() {
-  delegate_->OnDestroying();
-}
+TestSelectionDeviceManager::~TestSelectionDeviceManager() = default;
 
 void TestSelectionDeviceManager::CreateSource(wl_client* client,
                                               wl_resource* manager_resource,
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.h b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
index 9cbd84a7..8f5c180 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.h
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
@@ -6,6 +6,7 @@
 #define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_SELECTION_DEVICE_MANAGER_H_
 
 #include <cstdint>
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -35,14 +36,12 @@
 class TestSelectionDeviceManager : public GlobalObject {
  public:
   struct Delegate {
+    virtual ~Delegate() = default;
+
     virtual TestSelectionDevice* CreateDevice(wl_client* client,
                                               uint32_t id) = 0;
     virtual TestSelectionSource* CreateSource(wl_client* client,
                                               uint32_t id) = 0;
-    virtual void OnDestroying() = 0;
-
-   protected:
-    virtual ~Delegate() = default;
   };
 
   struct InterfaceInfo {
@@ -51,7 +50,8 @@
     uint32_t version;
   };
 
-  TestSelectionDeviceManager(const InterfaceInfo& info, Delegate* delegate);
+  TestSelectionDeviceManager(const InterfaceInfo& info,
+                             std::unique_ptr<Delegate> delegate);
   ~TestSelectionDeviceManager() override;
 
   TestSelectionDeviceManager(const TestSelectionDeviceManager&) = delete;
@@ -73,8 +73,7 @@
                         wl_resource* seat_resource);
 
  private:
-  const raw_ptr<Delegate> delegate_;
-
+  const std::unique_ptr<Delegate> delegate_;
   raw_ptr<TestSelectionDevice> device_ = nullptr;
   raw_ptr<TestSelectionSource> source_ = nullptr;
 };
@@ -82,14 +81,12 @@
 class TestSelectionOffer : public ServerObject {
  public:
   struct Delegate {
-    virtual void SendOffer(const std::string& mime_type) = 0;
-    virtual void OnDestroying() = 0;
-
-   protected:
     virtual ~Delegate() = default;
+
+    virtual void SendOffer(const std::string& mime_type) = 0;
   };
 
-  TestSelectionOffer(wl_resource* resource, Delegate* delegate);
+  TestSelectionOffer(wl_resource* resource, std::unique_ptr<Delegate> delegate);
   ~TestSelectionOffer() override;
 
   TestSelectionOffer(const TestSelectionOffer&) = delete;
@@ -104,8 +101,7 @@
                       int fd);
 
  private:
-  const raw_ptr<Delegate> delegate_;
-
+  const std::unique_ptr<Delegate> delegate_;
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
   ui::PlatformClipboard::DataMap data_to_offer_;
 };
@@ -113,18 +109,17 @@
 class TestSelectionSource : public ServerObject {
  public:
   struct Delegate {
+    virtual ~Delegate() = default;
+
     virtual void SendSend(const std::string& mime_type,
                           base::ScopedFD write_fd) = 0;
     virtual void SendFinished() = 0;
     virtual void SendCancelled() = 0;
     virtual void SendDndAction(uint32_t action) = 0;
-    virtual void OnDestroying() = 0;
-
-   protected:
-    virtual ~Delegate() = default;
   };
 
-  TestSelectionSource(wl_resource* resource, Delegate* delegate);
+  TestSelectionSource(wl_resource* resource,
+                      std::unique_ptr<Delegate> delegate);
   ~TestSelectionSource() override;
 
   using ReadDataCallback = base::OnceCallback<void(std::vector<uint8_t>&&)>;
@@ -142,7 +137,7 @@
                     const char* mime_type);
 
  private:
-  const raw_ptr<Delegate> delegate_;
+  const std::unique_ptr<Delegate> delegate_;
 
   std::vector<std::string> mime_types_;
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
@@ -151,17 +146,16 @@
 class TestSelectionDevice : public ServerObject {
  public:
   struct Delegate {
+    virtual ~Delegate() = default;
+
     virtual TestSelectionOffer* CreateAndSendOffer() = 0;
     virtual void SendSelection(TestSelectionOffer* offer) = 0;
     virtual void HandleSetSelection(TestSelectionSource* source,
                                     uint32_t serial) = 0;
-    virtual void OnDestroying() = 0;
-
-   protected:
-    virtual ~Delegate() = default;
   };
 
-  TestSelectionDevice(wl_resource* resource, Delegate* delegate);
+  TestSelectionDevice(wl_resource* resource,
+                      std::unique_ptr<Delegate> delegate);
   ~TestSelectionDevice() override;
 
   TestSelectionDevice(const TestSelectionDevice&) = delete;
@@ -181,10 +175,8 @@
   uint32_t selection_serial() const { return selection_serial_; }
 
  private:
-  const raw_ptr<Delegate> delegate_;
-
+  const std::unique_ptr<Delegate> delegate_;
   uint32_t selection_serial_ = 0;
-
   raw_ptr<TestSelectionDeviceManager> manager_ = nullptr;
 };
 
diff --git a/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc b/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
index bdf656c..c1f6b39 100644
--- a/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
+++ b/ui/ozone/platform/wayland/test/test_wayland_server_thread.cc
@@ -244,10 +244,10 @@
     case PrimarySelectionProtocol::kNone:
       return true;
     case PrimarySelectionProtocol::kZwp:
-      primary_selection_device_manager_.reset(CreateTestSelectionManagerZwp());
+      primary_selection_device_manager_ = CreateTestSelectionManagerZwp();
       break;
     case PrimarySelectionProtocol::kGtk:
-      primary_selection_device_manager_.reset(CreateTestSelectionManagerGtk());
+      primary_selection_device_manager_ = CreateTestSelectionManagerGtk();
       break;
   }
   return primary_selection_device_manager_->Initialize(display_.get());
diff --git a/ui/ozone/platform/wayland/test/test_zwp_primary_selection.cc b/ui/ozone/platform/wayland/test/test_zwp_primary_selection.cc
index 5be7d6cc..a1b418a 100644
--- a/ui/ozone/platform/wayland/test/test_zwp_primary_selection.cc
+++ b/ui/ozone/platform/wayland/test/test_zwp_primary_selection.cc
@@ -8,6 +8,7 @@
 #include <wayland-server-core.h>
 
 #include <cstdint>
+#include <memory>
 
 #include "base/memory/raw_ptr.h"
 #include "base/notreached.h"
@@ -31,8 +32,6 @@
                                               mime_type.c_str());
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionOffer> offer = nullptr;
 };
 
@@ -42,13 +41,13 @@
         &TestSelectionOffer::Receive, &Destroy};
     wl_resource* device_resource = device->resource();
     const int version = wl_resource_get_version(device_resource);
-    auto* delegate = new ZwpPrimarySelectionOffer;
-
+    auto owned_delegate = std::make_unique<ZwpPrimarySelectionOffer>();
+    auto* delegate = owned_delegate.get();
     wl_resource* new_offer_resource =
         CreateResourceWithImpl<TestSelectionOffer>(
             wl_resource_get_client(device->resource()),
             &zwp_primary_selection_offer_v1_interface, version, &kOfferImpl, 0,
-            delegate);
+            std::move(owned_delegate));
     delegate->offer = GetUserDataAs<TestSelectionOffer>(new_offer_resource);
     zwp_primary_selection_device_v1_send_data_offer(device_resource,
                                                     new_offer_resource);
@@ -66,8 +65,6 @@
     NOTIMPLEMENTED();
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionDevice> device = nullptr;
 };
 
@@ -91,8 +88,6 @@
     NOTREACHED() << "The interface does not support this method.";
   }
 
-  void OnDestroying() override { delete this; }
-
   raw_ptr<TestSelectionSource> source = nullptr;
 };
 
@@ -106,10 +101,11 @@
     static const struct zwp_primary_selection_device_v1_interface
         kTestSelectionDeviceImpl = {&TestSelectionDevice::SetSelection,
                                     &Destroy};
-    auto* delegate = new ZwpPrimarySelectionDevice;
+    auto owned_delegate = std::make_unique<ZwpPrimarySelectionDevice>();
+    auto* delegate = owned_delegate.get();
     wl_resource* resource = CreateResourceWithImpl<TestSelectionDevice>(
         client, &zwp_primary_selection_device_v1_interface, version_,
-        &kTestSelectionDeviceImpl, id, delegate);
+        &kTestSelectionDeviceImpl, id, std::move(owned_delegate));
     delegate->device = GetUserDataAs<TestSelectionDevice>(resource);
     return delegate->device;
   }
@@ -117,23 +113,22 @@
   TestSelectionSource* CreateSource(wl_client* client, uint32_t id) override {
     static const struct zwp_primary_selection_source_v1_interface
         kTestSelectionSourceImpl = {&TestSelectionSource::Offer, &Destroy};
-    auto* delegate = new ZwpPrimarySelectionSource;
+    auto owned_delegate = std::make_unique<ZwpPrimarySelectionSource>();
+    auto* delegate = owned_delegate.get();
     wl_resource* resource = CreateResourceWithImpl<TestSelectionSource>(
         client, &zwp_primary_selection_source_v1_interface, version_,
-        &kTestSelectionSourceImpl, id, delegate);
+        &kTestSelectionSourceImpl, id, std::move(owned_delegate));
     delegate->source = GetUserDataAs<TestSelectionSource>(resource);
     return delegate->source;
   }
 
-  void OnDestroying() override { delete this; }
-
  private:
   const uint32_t version_;
 };
 
 }  // namespace
 
-TestSelectionDeviceManager* CreateTestSelectionManagerZwp() {
+std::unique_ptr<TestSelectionDeviceManager> CreateTestSelectionManagerZwp() {
   constexpr uint32_t kVersion = 1;
   static const struct zwp_primary_selection_device_manager_v1_interface
       kTestSelectionManagerImpl = {&TestSelectionDeviceManager::CreateSource,
@@ -143,8 +138,9 @@
       .interface = &zwp_primary_selection_device_manager_v1_interface,
       .implementation = &kTestSelectionManagerImpl,
       .version = kVersion};
-  return new TestSelectionDeviceManager(
-      interface_info, new ZwpPrimarySelectionDeviceManager(kVersion));
+  return std::make_unique<TestSelectionDeviceManager>(
+      interface_info,
+      std::make_unique<ZwpPrimarySelectionDeviceManager>(kVersion));
 }
 
 }  // namespace wl
diff --git a/ui/ozone/platform/wayland/test/test_zwp_primary_selection.h b/ui/ozone/platform/wayland/test/test_zwp_primary_selection.h
index 10769482..ae9d279 100644
--- a/ui/ozone/platform/wayland/test/test_zwp_primary_selection.h
+++ b/ui/ozone/platform/wayland/test/test_zwp_primary_selection.h
@@ -5,12 +5,13 @@
 #ifndef UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZWP_PRIMARY_SELECTION_H_
 #define UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZWP_PRIMARY_SELECTION_H_
 
+#include <memory>
+
 #include "ui/ozone/platform/wayland/test/test_selection_device_manager.h"
 
 namespace wl {
 
-TestSelectionDeviceManager* CreateTestSelectionManagerZwp();
-
+std::unique_ptr<TestSelectionDeviceManager> CreateTestSelectionManagerZwp();
 }
 
 #endif  // UI_OZONE_PLATFORM_WAYLAND_TEST_TEST_ZWP_PRIMARY_SELECTION_H_
diff --git a/ui/ozone/platform/x11/x11_surface_factory.cc b/ui/ozone/platform/x11/x11_surface_factory.cc
index 3538b61e..9dc0c832 100644
--- a/ui/ozone/platform/x11/x11_surface_factory.cc
+++ b/ui/ozone/platform/x11/x11_surface_factory.cc
@@ -38,7 +38,7 @@
   kDMABuf,
 
   // Native pixmaps are first imported as X11 pixmaps using DRI3 and then into
-  // EGL. Using pixmap imports is currently not supported.
+  // EGL.
   kX11Pixmap,
 };
 
@@ -70,9 +70,7 @@
   }
 
   bool CanImportNativePixmap() override {
-    // TODO(crbug.com/1236697): enable X11Pixmap support when the Vaapi
-    // pipeline supports it.
-    return support_type_ == NativePixmapSupportType::kDMABuf;
+    return support_type_ != NativePixmapSupportType::kNone;
   }
 
   std::unique_ptr<NativePixmapGLBinding> ImportNativePixmap(
diff --git a/ui/views/controls/button/checkbox.cc b/ui/views/controls/button/checkbox.cc
index e75ef9a..7d16ae2 100644
--- a/ui/views/controls/button/checkbox.cc
+++ b/ui/views/controls/button/checkbox.cc
@@ -198,7 +198,7 @@
   if (features::IsChromeRefresh2023()) {
     active_color = GetColorProvider()->GetColor(
         (icon_state & IconState::CHECKED) ? ui::kColorAlertHighSeverity
-                                          : ui::kColorAlertMediumSeverity);
+                                          : ui::kColorAlertMediumSeverityIcon);
   }
 
   // Use the overridden checked icon image color instead if set.
diff --git a/ui/views/controls/button/label_button.cc b/ui/views/controls/button/label_button.cc
index 55f76e5..6a52de2 100644
--- a/ui/views/controls/button/label_button.cc
+++ b/ui/views/controls/button/label_button.cc
@@ -147,10 +147,6 @@
   ResetColorsFromNativeTheme();
 }
 
-void LabelButton::SetEnabledTextColorReadabilityAdjustment(bool enabled) {
-  label_->SetAutoColorReadabilityEnabled(enabled);
-}
-
 SkColor LabelButton::GetCurrentTextColor() const {
   return label_->GetEnabledColor();
 }
diff --git a/ui/views/controls/button/label_button.h b/ui/views/controls/button/label_button.h
index 80e2189..2b119b1 100644
--- a/ui/views/controls/button/label_button.h
+++ b/ui/views/controls/button/label_button.h
@@ -73,10 +73,6 @@
   // Sets the text colors shown for the non-disabled states to |color|.
   virtual void SetEnabledTextColors(absl::optional<SkColor> color);
 
-  // Enable the text colors to auto adjust for readability for the non-disabled
-  // states. Default to false.
-  void SetEnabledTextColorReadabilityAdjustment(bool enabled);
-
   // Gets the current state text color.
   SkColor GetCurrentTextColor() const;
 
diff --git a/ui/views/examples/README.md b/ui/views/examples/README.md
index cab2627..899514d 100644
--- a/ui/views/examples/README.md
+++ b/ui/views/examples/README.md
@@ -1,8 +1,29 @@
-`views_examples` and `views_examples_with_content` are similar tools to show
-all the views widgets with some varied styles. The latter has extra support to
-`web_view` as well.
 
-*To run either of the programs:*
+# Overview
+`views_examples` and `views_examples_with_content` are executable tools to
+showcase all the [Views](docs/ui/views/overview.md) components with some varied
+styles. The latter has extra support for `web_view` as well.
+
+## How to build and run
+`views_examples`
+```
+$ autoninja -C out/Default views_examples
+
+$ out/Default/views_examples
+```
+
+`views_examples_with_content`
+```
+$ autoninja -C out/Default views_examples_with_content
+
+$ out/Default/views_examples_with_content
+```
+
+**Note: Both programs are available on all desktop platforms which support Views
+toolkit, except `views_examples` is unavailable on Mac.**
+
+### Optional args
+*To run programs but only with specific examples enabled:*
 
 `<output_dir>/<program> [--enable-examples=<example1,[example2...]>]`
 
@@ -10,45 +31,65 @@
 
 `<output_dir>/<program> --help` will print out the above usage info.
 
+*To list examples:*
+
 `<output_dir>/<program> --enable-examples` will print out all names of available
 examples and execute as if all (the default) are specified.
 
+## How to use
+
+After launching the executable, there is a list of all available examples to
+browse.
+
+![Showcase gif](/docs/ui/views/images/views_examples_showcase.gif)
+
+Use the scroll bar and select the example you'd like to browse. You can find how
+how these examples are created below in the [examples](#examples) section. Each
+example is linked to a corresponding source file with basic implementation
+details.
+
+[Contact the Views team](/docs/ui/ask/index.md) if you have any questions.
+
+## Examples
+
 The current available examples are listed below:
 
-- Accessibility Features
-- Box Layout
-- Bubble
-- Button
-- Button (Sticker Sheet)
-- Checkbox
-- Colored Dialog
-- Combo Box
-- Dialog
-- Flex Layout
-- Label
-- Link
-- Login Bubble Dialog
-- Menu
-- Message Box View
-- Multiline RenderText
-- Native Theme Colors
-- Notification
-- Progress Bar
-- Radio Button
-- Scroll View
-- Slider
-- Tabbed Pane
-- Table
-- Text Styles
-- Textarea
-- Textfield
-- Throbber
-- Toggle Button
-- Tree View
-- Vector Icon
-- WebView
-- Widget
-
-Note: Both programs are available on all desktop platforms which support Views
-toolkit, except `views_examples` unavailable on Mac.
+- [Accessibility Features](/ui/views/examples/ax_example.cc)
+- [Animated Image View](/ui/views/examples/animated_image_view_example.cc)
+- [Badge](/ui/views/examples/badge_example.cc)
+- [Box Layout](/ui/views/examples/box_layout_example.cc)
+- [Bubble](/ui/views/examples/bubble_example.cc)
+- [Button](/ui/views/examples/button_example.cc)
+- [Button (Sticker Sheet)](/ui/views/examples/button_sticker_sheet.cc)
+- [Checkbox](/ui/views/examples/checkbox_example.cc)
+- [Colored Dialog](/ui/views/examples/colored_dialog_example.cc)
+- [Colors](/ui/views/examples/colors_example.cc)
+- [Combo Box](/ui/views/examples/combobox_example.cc)
+- [Designer](/ui/views/examples/designer_example.cc)
+- [Dialog](/ui/views/examples/dialog_example.cc)
+- [Fade Animation](/ui/views/examples/fade_animation.cc)
+- [Flex Layout](/ui/views/examples/flex_layout_example.cc)
+- [FloodFill Ink Drop](/ui/views/examples/ink_drop_example.cc)
+- [Label](/ui/views/examples/label_example.cc)
+- [Link](/ui/views/examples/link_example.cc)
+- [Login Bubble Dialog](/ui/views/examples/login_bubble_dialog_example.cc)
+- [Menu](/ui/views/examples/menu_example.cc)
+- [Message Box View](/ui/views/examples/message_box_example.cc)
+- [Multiline RenderText](/ui/views/examples/multiline_example.cc)
+- [Notification](/ui/views/examples/notification_example.cc)
+- [Progress Bar](/ui/views/examples/progress_bar_example.cc)
+- [Radio Button](/ui/views/examples/radio_button_example.cc)
+- [Scroll View](/ui/views/examples/scroll_view_example.cc)
+- [Slider](/ui/views/examples/slider_example.cc)
+- [Square Ink Drop](/ui/views/examples/square_ink_drop_example.cc)
+- [Tabbed Pane](/ui/views/examples/tabbed_pane_example.cc)
+- [Table](/ui/views/examples/table_example.cc)
+- [Text Styles](/ui/views/examples/text_example.cc)
+- [Textarea](/ui/views/examples/textarea_example.cc)
+- [Textfield](/ui/views/examples/textfield_example.cc)
+- [Throbber](/ui/views/examples/throbber_example.cc)
+- [Toggle Button](/ui/views/examples/toggle_button_example.cc)
+- [Tree View](/ui/views/examples/tree_view_example.cc)
+- [Vector Icon](/ui/views/examples/vector_example.cc)
+- [Widget](/ui/views/examples/widget_example.cc)
 
diff --git a/ui/views/examples/colors_example.cc b/ui/views/examples/colors_example.cc
index f1c5a4e..9e714ab 100644
--- a/ui/views/examples/colors_example.cc
+++ b/ui/views/examples/colors_example.cc
@@ -67,7 +67,7 @@
                   TableLayout::ColumnSize::kUsePreferred, 0, 0)
       .AddColumn(LayoutAlignment::kStretch, LayoutAlignment::kStretch, 1.0,
                  TableLayout::ColumnSize::kUsePreferred, 0, 0)
-      .AddRows(70, TableLayout::kFixedSize);
+      .AddRows(71, TableLayout::kFixedSize);
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorWindowBackground));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorDialogBackground));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorDialogForeground));
@@ -155,7 +155,8 @@
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorThrobber));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorThrobberPreconnect));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorAlertLowSeverity));
-  InsertColorRow(container, COLOR_LABEL_ARGS(kColorAlertMediumSeverity));
+  InsertColorRow(container, COLOR_LABEL_ARGS(kColorAlertMediumSeverityIcon));
+  InsertColorRow(container, COLOR_LABEL_ARGS(kColorAlertMediumSeverityText));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorAlertHighSeverity));
   InsertColorRow(container, COLOR_LABEL_ARGS(kColorIcon));
   // Expands the view to allow for scrolling.
diff --git a/ui/webui/resources/cr_components/app_management/BUILD.gn b/ui/webui/resources/cr_components/app_management/BUILD.gn
index 63afa62..410609d 100644
--- a/ui/webui/resources/cr_components/app_management/BUILD.gn
+++ b/ui/webui/resources/cr_components/app_management/BUILD.gn
@@ -107,7 +107,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
 
diff --git a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
index 6a2b0ec..2d34d7c 100644
--- a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
+++ b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
@@ -28,5 +28,5 @@
   ts_use_local_config = false
   tsc_dir =
       "$root_gen_dir/ui/webui/resources/tsc/cr_components/color_change_listener"
-  ts_deps = [ "//ui/webui/resources/mojo:library" ]
+  ts_deps = [ "//ui/webui/resources/mojo:build_ts" ]
 }
diff --git a/ui/webui/resources/cr_components/customize_themes/BUILD.gn b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
index c43f64d..47e7d11a 100644
--- a/ui/webui/resources/cr_components/customize_themes/BUILD.gn
+++ b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
@@ -45,7 +45,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/ui/webui/resources/cr_components/help_bubble/BUILD.gn b/ui/webui/resources/cr_components/help_bubble/BUILD.gn
index ceb621d..7e0d0984 100644
--- a/ui/webui/resources/cr_components/help_bubble/BUILD.gn
+++ b/ui/webui/resources/cr_components/help_bubble/BUILD.gn
@@ -39,6 +39,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/ui/webui/resources/cr_components/history_clusters/BUILD.gn b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
index 8fcbccd..cb9cb51 100644
--- a/ui/webui/resources/cr_components/history_clusters/BUILD.gn
+++ b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
@@ -63,7 +63,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/ui/webui/resources/cr_components/image_service/BUILD.gn b/ui/webui/resources/cr_components/image_service/BUILD.gn
index 98e36fc..eba4a01 100644
--- a/ui/webui/resources/cr_components/image_service/BUILD.gn
+++ b/ui/webui/resources/cr_components/image_service/BUILD.gn
@@ -18,6 +18,6 @@
   ]
 
   tsc_dir = "$root_gen_dir/ui/webui/resources/tsc/cr_components/image_service"
-  ts_deps = [ "//ui/webui/resources/mojo:library" ]
+  ts_deps = [ "//ui/webui/resources/mojo:build_ts" ]
   ts_use_local_config = false
 }
diff --git a/ui/webui/resources/cr_components/most_visited/BUILD.gn b/ui/webui/resources/cr_components/most_visited/BUILD.gn
index ff6eb7a..7fecb29b 100644
--- a/ui/webui/resources/cr_components/most_visited/BUILD.gn
+++ b/ui/webui/resources/cr_components/most_visited/BUILD.gn
@@ -37,7 +37,7 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 
   optimize = optimize_webui
diff --git a/ui/webui/resources/cr_components/omnibox/BUILD.gn b/ui/webui/resources/cr_components/omnibox/BUILD.gn
index a546b1c..56e790e 100644
--- a/ui/webui/resources/cr_components/omnibox/BUILD.gn
+++ b/ui/webui/resources/cr_components/omnibox/BUILD.gn
@@ -30,6 +30,6 @@
     "//third_party/polymer/v3_0:library",
     "//ui/webui/resources/cr_elements:build_ts",
     "//ui/webui/resources/js:build_ts",
-    "//ui/webui/resources/mojo:library",
+    "//ui/webui/resources/mojo:build_ts",
   ]
 }
diff --git a/ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.ts b/ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.ts
index 3a5b136..479a04d5 100644
--- a/ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.ts
+++ b/ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.ts
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assert} from 'chrome://resources/js/assert_ts.js';
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from '//resources/js/assert_ts.js';
+import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './cr_a11y_announcer.html.js';
 
diff --git a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
index c69794ef..de88e391 100644
--- a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
+++ b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html
@@ -44,7 +44,7 @@
         --cr-checkbox-checked-box-color: var(--color-checkbox-foreground-checked,
             var(--cr-fallback-color-primary));
         --cr-checkbox-unchecked-box-color: var(--color-checkbox-foreground-unchecked,
-            var(--cr-fallback-color-on-surface-variant));
+            var(--cr-fallback-color-outline));
         --cr-checkbox-ripple-checked-color: var(--cr-active-background-color);
         --cr-checkbox-ripple-unchecked-color: var(--cr-active-background-color);
         --cr-checkbox-ripple-opacity: 1;
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_mixin.ts b/ui/webui/resources/cr_elements/cr_container_shadow_mixin.ts
index c902d3b..bb6b6148 100644
--- a/ui/webui/resources/cr_elements/cr_container_shadow_mixin.ts
+++ b/ui/webui/resources/cr_elements/cr_container_shadow_mixin.ts
@@ -31,8 +31,8 @@
  * '#cr-container-shadow-[top/bottom].has-shadow', or define their own styles.
  */
 
-import {assert} from 'chrome://resources/js/assert_ts.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from '//resources/js/assert_ts.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 export enum CrContainerShadowSide {
   TOP = 'top',
diff --git a/ui/webui/resources/cr_elements/cr_grid/cr_grid.ts b/ui/webui/resources/cr_elements/cr_grid/cr_grid.ts
index 05b9dcb..f4852a3 100644
--- a/ui/webui/resources/cr_elements/cr_grid/cr_grid.ts
+++ b/ui/webui/resources/cr_elements/cr_grid/cr_grid.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './cr_grid.html.js';
 
diff --git a/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.ts b/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.ts
index e782fb89..c913e99 100644
--- a/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.ts
+++ b/ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.ts
@@ -12,8 +12,8 @@
 import '../cr_shared_vars.css.js';
 import '../icons.html.js';
 
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
 
 import {getTemplate} from './cr_card_radio_button.html.js';
 import {CrRadioButtonMixin, CrRadioButtonMixinInterface} from './cr_radio_button_mixin.js';
diff --git a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.ts b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.ts
index 19db318c..61dff5f 100644
--- a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.ts
+++ b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button.ts
@@ -7,8 +7,8 @@
 import '../cr_shared_vars.css.js';
 import './cr_radio_button_style.css.js';
 
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
 
 import {getTemplate} from './cr_radio_button.html.js';
 import {CrRadioButtonMixin, CrRadioButtonMixinInterface} from './cr_radio_button_mixin.js';
diff --git a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_mixin.ts b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_mixin.ts
index faf25d6..0c16dbd 100644
--- a/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_mixin.ts
+++ b/ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_mixin.ts
@@ -7,8 +7,8 @@
  */
 
 // clang-format off
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
 
 interface PaperRippleElement {
   clear(): void;
diff --git a/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts b/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts
index a3f61a4..1216b53 100644
--- a/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts
+++ b/ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.d.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
+import {LegacyElementMixin} from '//resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
 
 interface CrRadioGroupElement extends LegacyElementMixin, HTMLElement {
   disabled: boolean;
diff --git a/ui/webui/resources/cr_elements/cr_scrollable_mixin.ts b/ui/webui/resources/cr_elements/cr_scrollable_mixin.ts
index 6c48998..8080938 100644
--- a/ui/webui/resources/cr_elements/cr_scrollable_mixin.ts
+++ b/ui/webui/resources/cr_elements/cr_scrollable_mixin.ts
@@ -35,8 +35,8 @@
  */
 
 // clang-format off
-import {beforeNextRender, dedupingMixin, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
+import {beforeNextRender, dedupingMixin, microTask, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {IronListElement} from '//resources/polymer/v3_0/iron-list/iron-list.js';
 // clang-format on
 
 type IronListElementWithExtras = IronListElement&{
diff --git a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
index f95d04e..d27a0be 100644
--- a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
+++ b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_mixin.ts
@@ -6,8 +6,8 @@
  * Helper functions for implementing an incremental search field. See
  * <settings-subpage-search> for a simple implementation.
  */
-import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertNotReached} from '//resources/js/assert_ts.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrInputElement} from '../cr_input/cr_input.js';
 
diff --git a/ui/webui/resources/cr_elements/cr_shared_vars.css b/ui/webui/resources/cr_elements/cr_shared_vars.css
index 04ed879..6f76931b 100644
--- a/ui/webui/resources/cr_elements/cr_shared_vars.css
+++ b/ui/webui/resources/cr_elements/cr_shared_vars.css
@@ -236,6 +236,8 @@
   /* Colors: These variables should never be overridden and should only be used
      as fallback values for shared cr_elements or in UIs that do not have
      the color pipeline. */
+  --cr-fallback-color-outline: rgb(116, 119, 117);
+
   --cr-fallback-color-primary: rgb(11, 87, 208);
   --cr-fallback-color-on-primary: rgb(255, 255, 255);
 
@@ -273,6 +275,7 @@
 @media (prefers-color-scheme: dark) {
   html[chrome-refresh-2023] {
     /* Colors */
+    --cr-fallback-color-outline: rgb(142, 145, 143);
     --cr-fallback-color-primary: rgb(168, 199, 250);
     --cr-fallback-color-on-primary: rgb(6, 46, 111);
     --cr-fallback-color-primary-container: rgb(8, 66, 160);
diff --git a/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts b/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
index c449d7a2..08ed5a9 100644
--- a/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
+++ b/ui/webui/resources/cr_elements/cr_splitter/cr_splitter.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assert} from 'chrome://resources/js/assert_ts.js';
+import {assert} from '//resources/js/assert_ts.js';
 
 export class CrSplitterElement extends HTMLElement {
   static get is() {
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
index 4995ee8..32f7fec1 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -220,12 +220,12 @@
         z-index: -1;
       }
 
-      :host-context([chrome-refresh-2023]):host(
+      :host-context([chrome-refresh-2023].focus-outline-visible):host(
             [search-focused_]:not([narrow])) {
         outline: 2px solid var(--cr-focus-outline-color);
       }
 
-      :host-context([chrome-refresh-2023]):host(
+      :host-context([chrome-refresh-2023].focus-outline-visible):host(
             [search-focused_]:not([narrow])) #background {
         background-clip: padding-box;
       }
@@ -272,6 +272,16 @@
         margin-inline-start:
             var(--cr-toolbar-search-icon-margin-inline-start, 18px);
       }
+
+      paper-ripple {
+        display: none;
+      }
+
+      :host-context([chrome-refresh-2023]):host paper-ripple {
+        color: var(--cr-active-background-color);
+        display: block;
+        --paper-ripple-opacity: 1;
+      }
     </style>
     <div id="background"></div>
     <div id="stateBackground"></div>
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
index fcfc6356..556b871 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
@@ -7,22 +7,31 @@
 import '../icons.html.js';
 import '../cr_shared_style.css.js';
 import '../cr_shared_vars.css.js';
+import '//resources/polymer/v3_0/paper-ripple/paper-ripple.js';
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 
-import {DomIf, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {FocusOutlineManager} from '//resources/js/focus_outline_manager.js';
+import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
+import {DomIf, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {CrSearchFieldMixin} from '../cr_search_field/cr_search_field_mixin.js';
+import {CrSearchFieldMixin, CrSearchFieldMixinInterface} from '../cr_search_field/cr_search_field_mixin.js';
 
 import {getTemplate} from './cr_toolbar_search_field.html.js';
 
 export interface CrToolbarSearchFieldElement {
   $: {
     searchInput: HTMLInputElement,
+    searchTerm: HTMLElement,
     spinnerTemplate: DomIf,
   };
 }
 
-const CrToolbarSearchFieldElementBase = CrSearchFieldMixin(PolymerElement);
+const CrToolbarSearchFieldElementBase =
+    mixinBehaviors([PaperRippleBehavior], CrSearchFieldMixin(PolymerElement)) as
+    {
+      new (): PolymerElement & CrSearchFieldMixinInterface &
+          PaperRippleBehavior,
+    };
 
 
 export class CrToolbarSearchFieldElement extends
@@ -85,8 +94,12 @@
 
   override ready() {
     super.ready();
-
     this.addEventListener('click', e => this.showSearch_(e));
+
+    if (document.documentElement.hasAttribute('chrome-refresh-2023')) {
+      FocusOutlineManager.forDocument(document);
+      this.addEventListener('pointerdown', this.onPointerDown_.bind(this));
+    }
   }
 
   override getSearchInput(): HTMLInputElement {
@@ -175,6 +188,15 @@
     this.setValue('');
     this.getSearchInput().blur();
   }
+
+  private onPointerDown_(event: PointerEvent) {
+    // Hide the paper-ripple if the pointerdown event happened on a
+    // cr-icon-button. noink is a property inherited from PaperRippleBehavior.
+    this.noink = event.composedPath().some(item => {
+      return (item as HTMLElement).tagName === 'CR-ICON-BUTTON';
+    });
+    this.ensureRipple();
+  }
 }
 
 declare global {
diff --git a/ui/webui/resources/cr_elements/find_shortcut_mixin.ts b/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
index e51254b..ecabe9c 100644
--- a/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
+++ b/ui/webui/resources/cr_elements/find_shortcut_mixin.ts
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {KeyboardShortcutList} from 'chrome://resources/js/keyboard_shortcut_list.js';
-import {isMac} from 'chrome://resources/js/platform.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert, assertNotReached} from '//resources/js/assert_ts.js';
+import {KeyboardShortcutList} from '//resources/js/keyboard_shortcut_list.js';
+import {isMac} from '//resources/js/platform.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
  * @fileoverview Listens for a find keyboard shortcut (i.e. Ctrl/Cmd+f or /)
diff --git a/ui/webui/resources/cr_elements/i18n_mixin.ts b/ui/webui/resources/cr_elements/i18n_mixin.ts
index dc93740..bac58ee 100644
--- a/ui/webui/resources/cr_elements/i18n_mixin.ts
+++ b/ui/webui/resources/cr_elements/i18n_mixin.ts
@@ -10,9 +10,9 @@
  * handled by a C++ templatizer.
  */
 
-import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
-import {parseHtmlSubset, sanitizeInnerHtml, SanitizeInnerHtmlOpts} from 'chrome://resources/js/parse_html_subset.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {loadTimeData} from '//resources/js/load_time_data.js';
+import {parseHtmlSubset, sanitizeInnerHtml, SanitizeInnerHtmlOpts} from '//resources/js/parse_html_subset.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 type Constructor<T> = new (...args: any[]) => T;
 
diff --git a/ui/webui/resources/cr_elements/list_property_update_mixin.ts b/ui/webui/resources/cr_elements/list_property_update_mixin.ts
index 46e7aaaf..b6e8297 100644
--- a/ui/webui/resources/cr_elements/list_property_update_mixin.ts
+++ b/ui/webui/resources/cr_elements/list_property_update_mixin.ts
@@ -15,7 +15,7 @@
  * containing information about all the edits is sent to the polyer object.
  */
 
-import {calculateSplices, dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {calculateSplices, dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 type Constructor<T> = new (...args: any[]) => T;
 
diff --git a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts
index ee8a9375..8365491 100644
--- a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts
+++ b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.ts
@@ -8,7 +8,7 @@
  * mouse events too.
  */
 
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 const HOVERED_STYLE: string = 'hovered';
 
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_mixin.ts b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_mixin.ts
index db3fa0c..a6f1bdd 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_mixin.ts
+++ b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_mixin.ts
@@ -8,8 +8,8 @@
  * rework the "policy" naming scheme throughout this directory.
  */
 
-import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertNotReached} from '//resources/js/assert_ts.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
  * Strings required for policy indicators. These must be set at runtime.
diff --git a/ui/webui/resources/cr_elements/web_ui_listener_mixin.ts b/ui/webui/resources/cr_elements/web_ui_listener_mixin.ts
index 2b700d9..192d5b2e 100644
--- a/ui/webui/resources/cr_elements/web_ui_listener_mixin.ts
+++ b/ui/webui/resources/cr_elements/web_ui_listener_mixin.ts
@@ -7,8 +7,8 @@
  * automatically remove WebUI listeners when detached.
  */
 
-import {addWebUiListener, removeWebUiListener, WebUiListener} from 'chrome://resources/js/cr.js';
-import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {addWebUiListener, removeWebUiListener, WebUiListener} from '//resources/js/cr.js';
+import {dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 type Constructor<T> = new (...args: any[]) => T;
 
diff --git a/ui/webui/resources/js/BUILD.gn b/ui/webui/resources/js/BUILD.gn
index c3c2bfce9..b5ad8912 100644
--- a/ui/webui/resources/js/BUILD.gn
+++ b/ui/webui/resources/js/BUILD.gn
@@ -74,7 +74,7 @@
 
   tsc_dir = "$root_gen_dir/ui/webui/resources/tsc/js"
   tsc_allow_js = true
-  ts_deps = [ "../mojo:library" ]
+  ts_deps = [ "../mojo:build_ts" ]
   ts_definitions = [
     "//tools/typescript/definitions/chrome_send.d.ts",
     "//tools/typescript/definitions/chrome_timeticks.d.ts",
diff --git a/ui/webui/resources/js/color_utils.ts b/ui/webui/resources/js/color_utils.ts
index c496de1..4f52ee9 100644
--- a/ui/webui/resources/js/color_utils.ts
+++ b/ui/webui/resources/js/color_utils.ts
@@ -6,7 +6,7 @@
  * @fileoverview Helper functions for color manipulations.
  */
 
-import {SkColor} from 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
+import {SkColor} from '//resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
 
 /**
  * Converts an SkColor object to a string in the form
diff --git a/ui/webui/resources/js/focus_row_mixin.ts b/ui/webui/resources/js/focus_row_mixin.ts
index 8cf2da2..db57036 100644
--- a/ui/webui/resources/js/focus_row_mixin.ts
+++ b/ui/webui/resources/js/focus_row_mixin.ts
@@ -3,7 +3,8 @@
 // found in the LICENSE file.
 
 // clang-format off
-import {afterNextRender, dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, dedupingMixin, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
 import {assert} from './assert_ts.js';
 import {focusWithoutInk} from './focus_without_ink.js';
 import {FocusRow, FocusRowDelegate} from './focus_row.js';
diff --git a/ui/webui/resources/js/metrics_reporter/browser_proxy.ts b/ui/webui/resources/js/metrics_reporter/browser_proxy.ts
index 7524d54..d5243027 100644
--- a/ui/webui/resources/js/metrics_reporter/browser_proxy.ts
+++ b/ui/webui/resources/js/metrics_reporter/browser_proxy.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {TimeDelta} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
+import {TimeDelta} from '//resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
 import {PageMetricsCallbackRouter, PageMetricsHost, PageMetricsHostRemote} from '../metrics_reporter.mojom-webui.js';
 
diff --git a/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts b/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
index c2ef2bd..8fe0f9f 100644
--- a/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
+++ b/ui/webui/resources/js/metrics_reporter/metrics_reporter.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {TimeDelta} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
+import {TimeDelta} from '//resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
 import {assert} from '../assert_ts.js';
 
diff --git a/ui/webui/resources/mojo/BUILD.gn b/ui/webui/resources/mojo/BUILD.gn
index bc439318..c5e64590 100644
--- a/ui/webui/resources/mojo/BUILD.gn
+++ b/ui/webui/resources/mojo/BUILD.gn
@@ -60,7 +60,7 @@
 
 # Move all the files out of mojom-webui to the expected location.
 preprocess_if_expr("copy_mojo") {
-  visibility = [ ":library" ]
+  visibility = [ ":build_ts" ]
 
   in_folder = "$root_gen_dir/mojom-webui"
   out_folder = "$target_gen_dir/preprocessed"
@@ -99,7 +99,7 @@
   }
 }
 
-ts_library("library") {
+ts_library("build_ts") {
   root_dir = "$target_gen_dir/preprocessed"
   out_dir = tsc_folder
   composite = true
@@ -132,11 +132,11 @@
   input_files_base_dir = rebase_path("$root_gen_dir/", root_build_dir)
   input_files = [ "mojo/public/js/bindings.js" ]
   deps = [
-    ":library",
+    ":build_ts",
     "//mojo/public/js:bindings_module",
   ]
   manifest_files =
-      filter_include(get_target_outputs(":library"), [ "*.manifest" ])
+      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
   out_grd = "$target_gen_dir/resources.grdp"
   resource_path_prefix = "mojo"
 }
diff --git a/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java b/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java
index f01996b..fe107b1b 100644
--- a/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java
+++ b/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java
@@ -36,7 +36,7 @@
     public static final String INITIAL_URL = "https://initial.com";
     public static final String SPECULATED_URL = "https://speculated.com";
     public static final String NTP_URL = "chrome://newtab/";
-    public static final String DOM_DISILLER_URL = "distiller://url";
+    public static final String DOM_DISILLER_URL = "chrome-distiller://url";
     public static final String RED_1 = "https://www.red.com/page1";
     public static final String RED_2 = "https://www.red.com/page2";
     public static final String RED_3 = "https://www.red.com/page3";
@@ -118,8 +118,8 @@
                 "73,1,true,0,6,0,-1,0,-1,9,6,0,-1,15,1,0,-1,0,-1,"
                         + "false,false,chrome://newtab/");
         map.put(DOM_DISILLER_URL,
-                "73,1,true,0,9,0,-1,0,-1,0,-1,0,-1,10,5,0,-1,0,-1,"
-                        + "false,false,distiller://url");
+                "82,1,true,0,16,0,-1,0,-1,19,3,0,-1,22,1,0,-1,0,-1,false,false,"
+                        + "chrome-distiller://url/");
         map.put(MAPS_URL,
                 "82,1,true,0,5,0,-1,0,-1,8,15,0,-1,23,1,0,-1,0,-1,false,false,https://maps.google.com/");
         map.put(AMP_URL,
diff --git a/weblayer/browser/autofill_client_impl.cc b/weblayer/browser/autofill_client_impl.cc
index 057eb51..d864427 100644
--- a/weblayer/browser/autofill_client_impl.cc
+++ b/weblayer/browser/autofill_client_impl.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "build/build_config.h"
+#include "components/android_autofill/browser/android_autofill_manager.h"
 #include "components/autofill/core/browser/autofill_download_manager.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/ui/suggestion.h"
@@ -391,9 +392,9 @@
 }
 
 AutofillClientImpl::AutofillClientImpl(content::WebContents* web_contents)
-    : content::WebContentsUserData<AutofillClientImpl>(*web_contents),
+    : autofill::ContentAutofillClient(
+          web_contents,
+          base::BindRepeating(&autofill::AndroidDriverInitHook, this)),
       content::WebContentsObserver(web_contents) {}
 
-WEB_CONTENTS_USER_DATA_KEY_IMPL(AutofillClientImpl);
-
 }  // namespace weblayer
diff --git a/weblayer/browser/autofill_client_impl.h b/weblayer/browser/autofill_client_impl.h
index 5056ee6..237c6499 100644
--- a/weblayer/browser/autofill_client_impl.h
+++ b/weblayer/browser/autofill_client_impl.h
@@ -7,7 +7,7 @@
 
 #include "base/compiler_specific.h"
 #include "build/build_config.h"
-#include "components/autofill/core/browser/autofill_client.h"
+#include "components/autofill/content/browser/content_autofill_client.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 
@@ -16,11 +16,23 @@
 // A minimal implementation of autofill::AutofillClient to satisfy the minor
 // touchpoints between the autofill implementation and its client that get
 // exercised within the WebLayer autofill flow.
-class AutofillClientImpl
-    : public autofill::AutofillClient,
-      public content::WebContentsUserData<AutofillClientImpl>,
-      public content::WebContentsObserver {
+class AutofillClientImpl : public autofill::ContentAutofillClient,
+                           public content::WebContentsObserver {
  public:
+  static AutofillClientImpl* FromWebContents(
+      content::WebContents* web_contents) {
+    return static_cast<AutofillClientImpl*>(
+        ContentAutofillClient::FromWebContents(web_contents));
+  }
+
+  static void CreateForWebContents(content::WebContents* contents) {
+    DCHECK(contents);
+    if (!FromWebContents(contents)) {
+      contents->SetUserData(UserDataKey(),
+                            base::WrapUnique(new AutofillClientImpl(contents)));
+    }
+  }
+
   AutofillClientImpl(const AutofillClientImpl&) = delete;
   AutofillClientImpl& operator=(const AutofillClientImpl&) = delete;
 
@@ -155,11 +167,8 @@
 
  private:
   explicit AutofillClientImpl(content::WebContents* web_contents);
-  friend class content::WebContentsUserData<AutofillClientImpl>;
 
   std::unique_ptr<autofill::AutofillDownloadManager> download_manager_;
-
-  WEB_CONTENTS_USER_DATA_KEY_DECL();
 };
 
 }  // namespace weblayer
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc
index d3a3bf8..3bd7a0d 100644
--- a/weblayer/browser/tab_impl.cc
+++ b/weblayer/browser/tab_impl.cc
@@ -445,9 +445,6 @@
     // Some user-data on WebContents directly or indirectly references this.
     // Remove that linkage to avoid use-after-free.
     web_contents_->RemoveUserData(&kWebContentsUserDataKey);
-    web_contents_->RemoveUserData(
-        autofill::ContentAutofillDriverFactory::
-            kContentAutofillDriverFactoryWebContentsUserDataKey);
     // Have Profile handle the task posting to ensure the WebContents is
     // deleted before Profile. To do otherwise means it would be possible for
     // the Profile to outlive the WebContents, which is problematic (crash).
@@ -1219,11 +1216,6 @@
   DCHECK(autofill::AutofillProvider::FromWebContents(web_contents));
 
   AutofillClientImpl::CreateForWebContents(web_contents);
-
-  autofill::ContentAutofillDriverFactory::CreateForWebContentsAndDelegate(
-      web_contents, AutofillClientImpl::FromWebContents(web_contents),
-      base::BindRepeating(&autofill::AndroidDriverInitHook,
-                          AutofillClientImpl::FromWebContents(web_contents)));
 }
 
 #endif  // BUILDFLAG(IS_ANDROID)